2 条题解

  • 0
    @ 2022-9-13 13:01:34

    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))

    • @ 2022-9-14 15:24:39

      这种做法能通过的比较重要的原因是本题的值域非常小且为整点。也就是说命题人造数据的时候并没有考虑到还有这种做法

信息

ID
160
时间
1000ms
内存
256MiB
难度
9
标签
(无)
递交数
242
已通过
16
上传者