poj 1018 Communication System(枚举+贪心)

    技术2022-05-18  24

    这个题的思路还是在网上看一位学姐的,但稍稍按我的思路改了一下,让循环的次数减少了很多,我以为这样执行的时间会少一点,可是没想到,我把两个程序都提交了一下,那位学姐的代码时间是47ms,而我改之后的竟然是500多ms,我这就不是很理解了,可能是因为我用了一个排序,排序要花去很多时间,所以多了好几百!

    我的思路:将输入的宽带值,进行升序排序,然后对宽带从小到大一一进行枚举,对宽带的每一个值,在价格里贪心的选择最小的(注意:选最小的价格,要先满足和该价格相对应的宽带值,比当前的宽带值大或等于),这样就求出了每一个宽带的B/P值,选取最大的就是所求的值了。

    下面是代码:

    #include <stdio.h> #include <algorithm> using namespace std; #define N 101 int main() { freopen("in.txt","r",stdin); int band[N][N],price[N][N]; int sortBand[100*N]; int m[N];//每个设备的存储商家的个数 int i,j,k,mm,n,t,sump,min; float res; scanf("%d",&t); while(t--) { k=0; mm=0; memset(sortBand,0,sizeof(sortBand)); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&m[i]); mm+=m[i]; for(j=1;j<=m[i];j++) { scanf("%d%d",&band[i][j],&price[i][j]); sortBand[++k]=band[i][j]; } } sort(sortBand+1,sortBand+mm+1); res=0.0; for(i=1;i<=mm;i++) { sump=0; for(j=1;j<=n;j++) { min=55555; for(k=1;k<=m[j];k++) { if(band[j][k]>=sortBand[i] && price[j][k]<min) {/*要想用这个价格较小的,必须满足和这个价格一组的宽带比当前最小宽带大或等于*/ min=price[j][k]; } } sump+=min; } if(sortBand[i]*1.0/sump-res>0) res=sortBand[i]*1.0/sump; } printf("%.3f/n",res); } return 0; }  

    自己还得加把劲啊!


    最新回复(0)