程序设计竞赛题解思考与变通.docVIP

  • 3
  • 0
  • 约1.32万字
  • 约 16页
  • 2017-09-02 发布于浙江
  • 举报
程序设计竞赛题解思考与变通

程序设计竞赛题解、思考与变通 (2014湖南理工学院程序设计竞赛评析) 1.旅馆开关门 旅馆里有10000间房间,从1到10000编了号。第一位服务员把所有的房间门都打开了,第二位服务员把所有编号是2的倍数的房间进行“相反处理”,第三位服务员把所有编号是3的倍数的房间作“相反处理”,……, 第n(1=n=10000)位服务员把所有编号是的倍数的房间作“相反处理”。问第个服务员来过后,问共有多少张门是打开的(C)。(所谓“相反处理”是:原来开着的门关上,原来关上的门打开。)#includestdio.h void main() { int j,k,n,s,a[10001]; printf( 请输入正整数n(n=10000): ); scanf(%d,n); // 输入n for(j=1;j=10000;j++) a[j]=0; s=0; for(k=1;k=n;k++) for(j=1;j=10000;j++) if(j%k==0) a[j]=1-a[j]; //相反处理:也可a[j]=(a[j]+1)%2; for(j=1;j=10000;j++) s+=a[j]; printf(%d\n,s); // 输出结果 } 变通:求在这n个服务员中,哪一个服务员处理后门开的最少? // 旅馆开关门 #includestdio.h void main() { int j,k,n,s,km,min,a[10001]; printf( 请输入正整数n(n=10000): ); scanf(%d,n); // 输入n for(j=1;j=10000;j++) a[j]=0; min=20000; for(k=1;k=n;k++) { s=0; for(j=1;j=10000;j++) { if(j%k==0) a[j]=1-a[j]; // j为k倍数时a[j] 施相反处理 s+=a[j]; } if(smin){min=s;km=k;} } printf( %d,%d\n,km,min); // 输出结果 } 请输入正整数n(n=10000): 2014 82,3703 在2014个服务员中,第82个服务员处理后门开的最少:3703扇门打开! 思考:求在这n个服务员中,哪一个服务员处理后的开门数最接近某一指定整数m(例如2014)? 2.喝汽水 有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有1=n1012) 个空汽水瓶,最多可以换多少瓶(max)汽水喝?n+m≥3m m≤n/2 max=[n/2] n为偶数时取其一半;n为奇数时取其一半取整。 // 喝汽水 #includestdio.h void main() { long n; printf( 请输入正整数n: ); scanf(%ld,n); // 输入n printf(%ld\n,n/2); // 输出结果 } 变通: 某学院有m个学生参加南湖春游,休息时喝汽水。南湖商家公告: 买1瓶汽水定价1.40元,喝1瓶汽水(瓶不带走)1元。 为节约资源,规定3个空瓶可换回1瓶汽水,或20个空瓶可换回7瓶汽水。 (3) 为方面顾客,可先借后还。例如借1瓶汽水,还3个空瓶;或借7瓶汽水,还20个空瓶。 问m个学生每人喝1瓶汽水(瓶不带走),至少需多少元? 输入正整数m(2m10000),输出至少需多少元(精确到小数点后第2位)。 解:注意到春游喝汽水无需带走空瓶,根据商家的规定作以下分析。 (1) 如果人数为20人,买13瓶汽水,借7瓶汽水,饮完20瓶汽水后还20个空瓶(即相当于换回7瓶汽水还给商家),两清。此时每人花费为 13/20*1.40=0.91元 (2) 如果人数为3人,买2瓶汽水,借1瓶汽水,饮完3瓶汽水后还3个空瓶(即相当于换回1瓶汽水还给商家),两清。此时每人花费为 2/3*1.40=0.93…元 (3) 如果只有2人或1人,每人喝1瓶汽水(瓶不带走),此时每人花费1元。 (4) 注意到0.910.931,因而有以下的最省钱算法: 1) 把m人分为x=m/20个大组,每组20人。每组买13瓶汽水(借

文档评论(0)

1亿VIP精品文档

相关文档