您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 2050网络赛题解
  所属分类: C/C++
  开发工具:
  文件大小: 1mb
  下载次数: 0
  上传时间: 2019-04-19
  提 供 者: mlm****
 详细说明:2050网络赛题解最全的题解报告,不要钱,免费给using namespace std; typedef long long ILi typedef double db; void main(t string tcin>>ti int h, m,S; scanf("&d: &d: &d",&h,&m, &s)i int ans=(s+m*60)8100; printf("d\n",(100-ans)8100) int main(t int ti scanf(" d",&t) while(t--)Main(; return 0 分宿舍 如果没有情侣房的话,实际上可以对男女分别考虑(双人间和三人间只能住同性),我们考虑计算 个数组:f2表示有讠个同性要住到双人间或三人间内,最少需要多少钱 我们如何计算∫呢,考虑一个简单的方法,我们可以枚举买了几个双人间和几个三人间,也就是 f=Min2+3≥2a+3b 于是我们得到了一个O(n23)计算∫的方法 进一步地,我们令: gi=Min2.x:+31 -_i 2a+ 3b 那么J2=Min≥9 首先计算g只要O(m2),因为确定了和m后,有y=(-2x)/3 之后再O(n)或者O(m2)地通过g计算f即可 现在我们得到了在O(m2)时间内计算f的方法,当k=0时,答案就是fn+fm 那么在k>0时,我们枚举有讠对情侣住情侣房,那么相当于剩下了+k-个男生,m+k-i 个女生,所以这个方案的答案是ac+fn+k-+f+m+k-z 听以答案就是Min=0.kic+fn+k-;+fm+k- 时间复杂度:O(n2) 当然,细心的同学也可以发现:g的计算过程其实可以用一个简单的背包在O(m)内计算出来,所以 本题也可以在O(m)的时间内解决 Code(O(n)) fincludesstdio.h> include fincludesalgorithm> include Include fincludesset> include include include fincludesiostream> include #define pii pairsintrint> #define fi first define se second #define pb push back #define rep(i,j, k) for(int i=(int)(3);i<=(int)(k);i++) #define per(i,j, k) for(int i=(int)(3);i>=(int)(k);i--) using namespace std? typedef longlong ILi typedef double db; const int N=3225 int n kill ab, c LL fn] void Main(i scanf(dsd8dlldlldglld",&n,&m,&k, &a,&b, &c) assert(0<=n&&n<=1000) assert(0<=m&&m<=1000) assert(0<=k&&k<=1000); assert(0<=a&&a<=1000000000) assert(0<=b&&b<=1000000000) assert(0<=c&&c<=1000000000); rep(i,0,n+k+m+20)f[i]=(111<<60); f[0]=0; rep(i,2,n+k+m+20)f[i1=min(f[i],f[i-2]+a);//背包,物品体积为2,费用为a rep(i,3,n+k+m+20)f[i]=min(f[i],f[i-3]+b);//背包,物品体积为3,费用为b per(i,n+k+m+19,0)f[i]=min(玨[i],f[i+1]);//考虑不住满的情况 Lans=111<<60; rep(i,0,k)ans=min(ans,i*111*c+f[n+k-i]+f[m+k-i]);//枚举情侣房个数,计算 答案 printf("glld\n", ans); int main()i intt; scant("暑d",&t) assert(1<=t&&t<=50); while(t--)Main(i return 07 Code(o(n)) # include #includecalgorithm> fincludesvector> include fincludesset> fincludescmath> inc⊥ude< queue> finc lude fincludesiostream> include #define pii pair<, int> #define fi first #define se second tdefine pb push back #define rep(i,j,k) for(int i=(int)(3);i<=(int)(k)ii++) #define per(i,j, k) for(int i=(int)(3);i>=(int)(k)ii--) using namespace std; typedef longlong ILi typedef double db; const int N=3225 int n, m k:Il a b,ci LL fn] void Main(t scanf("d3dd11d811d811d",&n,&m,&k,&a,&b,&C); assert(0<=n&&n<=1000) assert(0<=m&&m<=1000) assert(0<=k&&k<=1000) assert(0<=a&&a<=1000000000); assert(0<=b&&b<=1000000000) assert(0<=c&&C<=1000000000); rep(i,0,n+k+m+20)f[i]=(111<<60) rep(i,0,n+k+m+20)xep(x,0,i/2)if((i-2*x)33==0){ inty=(i-2*x)/3; //枚举i,x,计算y f[ij=min(f[i],a*111*x+b*111*y); //计算f per(i, n+k+m+19,0)f[i]=min(f[i], f[i+l1); II ans=111<<60; rep(i,0, k)ans=min(ans, i*lll*c+f[n+k-l]+f[m+k-1])i printf("olld\n",ans); int main(t int t scanf(d",&t) assert(1<=t&&t<=50); while(t--)Main() return 0 PASS 对于一个选手而言,要获得PASS必须要同时满足以下两个条件 在自己的学校里是前L影优秀的 总排名在前50%内 所以对于一个学校,假设它的人数是m,其中进入前50%的学生有y个,它获得的PASS个数就是 mon 对于每个学校,我们统计相应的y即可 时间复杂度:O(m) tincludesstdio.h> include include finc lude include #inc⊥ude< assert,h> fincludesset> include include include include #include #define pii paircintr int> define fi first *define se second #define pb push back #define rep(i,i,k) for(int i=(int)(i);i<=(int)(k);i++) #define per(i,j, k) for(int i=(int)(3)i>=(int)(k);i--) using namespace std: typedef longlong ILi typedef double db; const int N=10005 nt n,m,k int cnt[n]i ntd[N]冫 void Main(t scanf("d岩d旨d",&n,&m,板k) assert(1<=n&n<=10000) assert(1<=m&m<=1000); assert(1<=k&&k<=20); rep(i,l mcnt[il=d[i]=0; rep(i,l, n)f scanf("岩d",&a[i]) assert(l<=a[i]&&a[i]<=m) cnt[a[1]]++; /cnt[x]表示第x个学校的入数 if(i*2<=n)d[ai11++;//d[x1表示第x个学校进入前50号的学生的人数 int ans=0 rep(i,l, m)i ans+=min(cnt[il/k,d[il) printf("8d、n",ans); int main(i int t; scanf( gd" ,&t)i assert(1<=t&&t<=10); while(t--)Main(; return o 球赛 因为乒乓球比赛的规则,获胜一方必须领先至少2分才行,所以比分在极端情况下是没有上限的 但是我们观察到,当≥10时,m:m这种比分实际上和9:9相同 同样的,当c>10时,+1:这种比分实际上和10:9相同,都是领先方下一次赢就结束,没嬴 就开始僵局 所以我们通过上述的转化,可以将比分的值限制在0.10内 接下来考虑动态规划 令f,,表示,假设我们填完前讠局中的所有问号,且当前的比分是m:y的话,我们最多完成了几局 考虑转移,实际上只要考虑第讠十1局是谁贏,然后通过乒乓球的规则和上述规则得到新的比分 :y,然后转移到f+1,,y即可,转移时还要判断一局是否结束,这个等价于判断x′=y=0 时间复杂度:O(112n) Code #inc⊥ude< cstdio> include include include inc⊥ude< cmath> include include # include< assert。h> using namespace std: int test;n,f[10011][11][11]; char str[100011] struct node t int x, y, Z node calc(int i, int j)t //计算i:j这个比分会转化成什么样,结果是node{x,y,z},表示比分变成x:y,z表示有 没有新完成一局 node tmp; tmp. z 0 y else I tmp if(i==10&&j==10) tmp.x tmp y =9 else 七 i,tmp return tmp; int main(( scanf("d",&test)i assert(l<=test&&test<=5l)i for (i test--i)t scanf("s", str)i n strlen(str) assert(1<=n&&n<=10000) memset(f, 128, sizeof(f))i for(int i=0;ia2-1,转移是令 f2+1=ma(+10,mn(:,b+1)-a+1+c+1) 时间复杂度:O(n2) Code: inc1ude< stdio。h> include include #include include #inc ludesassert. h> include #include include #include fincludesiostream> #include define fi first *define se second tdefine pb push back #define rep(i,i,k) for(int i=(int)(i);i<=(int)(k);i++) #define per(i, j,k) for(int i=(int)(i)i>=(int)(k);i--) using namespace stdi typedef long long Ll; typedef double db const int N=1005 LL fN][N] int n,a[n], b[N], C[N],m; void Main(i scanf("dgd",&n,&m) assert(l<=n&&n<=1000) assert(1<=m&&m<=1000000000); rep(i,l, nscanf(ddd"r&alil,&b[il,&c[i]) ep( assert(0<=a[立]&&a[i]<=1000000000); assert(0<=b[i&&b[ij<=1000000000); assert(0<=c[i]&&c[i]<=1000000000) rep(i,o,nrep(],0,n)f[i1[3=0; f[0][0J= rep(i,0, n-lrep(j,ori)if(f[i1[j])t f[i+1][j]=max(f[i+1][j],f[i][j]+c[i+1]) if(min(f[i1[j],b[i+11*111)>a[i+11) f[i+1][j+1]=max(王[i+1J[j+1J,min(f[iJ[j,b[立+1]*111) a[i+1]+c[i+1]); per( 0)if(f[n][立]){ tf("岩d\n",i return t main(t int ti scanf(&d",&t)i assert(1<=t&&t<=50); hile(t-Main( return o 大厦 样例
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 相关搜索: 2050网络赛题解
 输入关键字,在本站1000多万海量源码库中尽情搜索: