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