2 条题解
-
0
emmm……我看1≤n≤450,要不这道题暴力破解好了…… 我们以0.01为精度,依次枚举各部分分数占比,这样就能得到小林的最高排名了。 显然这也是一个O(n^3)的算法。 考虑到float乘int会比int乘int慢一些(如有不对请指出),我们枚举时会将
for(float i=0.00;i<=1.00;i+=0.01)
改写为for(int i=0;i<=100;++i)
。 代码见下:#include<bits/stdc++.h> using namespace std; int n,ans; int c1,c2; struct node{ bool b; int x,y,z; int all; }scr[451]; bool cmp(node a,node b){ if(a.all>b.all) return true; if(a.all==b.all&&b.b==true) return true; return false; } int main(){ scanf("%d",&n); scr[1].b=true; for(int i=1;i<=n;++i){ scanf("%d%d%d",&scr[i].x,&scr[i].y,&scr[i].z); } ans=450; for(c1=0;c1<=100;c1++){ for(c2=0;c2<=100-c1;c2++){ for(int i=1;i<=n;++i){ scr[i].all=c1*scr[i].x+c2*scr[i].y+(100-c1-c2)*scr[i].z; } sort(scr+1,scr+n+1,cmp); int scr1=-1,rck=-1; //for(int i=1;i<=n;++i)) printf("c1=%d,c2=%d,scr[%d]=%d\n",c1,c2,i,scr[i].all); for(int i=1;i<=n;++i){ if(scr1!=scr[i].all){ scr1=scr[i].all; rck=i; } if(scr[i].b==true){ if(rck<ans) ans=rck; break; } } } } printf("%d",ans); return 0; }
(中间有一些注释是我比赛时debug用的) (其实H1也能枚举过,不过枚举的精度应当是1/2907,因为似乎有个测试数据跟17或19有点关系(2907=9*17*19))
信息
- ID
- 160
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 242
- 已通过
- 16
- 上传者