A:电话费
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
每到月初,小明都会收到中国移动的扣费通知。小明很喜欢打电话,每个月的电话费都很多,所以他去办了优惠套餐。假设小明这个月打了n次电话,小明可以选择不交其中s次电话的话费。小明算术能力很差,请帮帮他算一下这个月最少要交多少话费。
- 输入
- 输入包含两行:第一行为这个月打的电话数n,可以免费的电话数s,其中0 < s,n < 100;第二行包含n个实数,为每次电话的话费。每行中的二个数据之间均已空格间隔。
- 输出
- 输出只有一行,为小明这个月最少要交的话费(保留1位小数)。
- 样例输入
-
7 3 2.0 1.2 3.1 0.6 4.1 1.7 1.2
- 样例输出
- 4.7
#include<iostream> using namespace std; #include<cstdio> #define N 101 int n,s; double a[N]; #include<algorithm> int main() { scanf("%d%d",&n,&s); for(int i=1;i<=n;++i) { scanf("%lf",&a[i]); } sort(a+1,a+n+1); double sum=0; for(int i=1;i<=n-s;++i) sum+=a[i]; printf("%0.1f",sum); return 0; }
B:三个三位数的关系
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
将 1 到 9 这九个数字分成三个 3 位数,要求第一个 3 位数,正好是第二个 3 位数的一半,是第三个 3 位数的三分之一。问该如何分。
- 输入
- 没有输入。
- 输出
- 按第一个数从小到大输出满足条件的方案,每个方案占一行。方案中每个数之间用一个空格分开。
- 样例输入
-
没有输入。
- 样例输出
- 就不告诉大家答案了: )
#include<iostream> using namespace std; #include<cstdio> bool judge(int a,int b,int c) { int flag[10]={0}; if(a<100||b<100||c<100) return false; for(int i=1;i<=3;++i) { int k=a%10; flag[k]++; if(flag[k]>1) return false; a/=10; } for(int i=1;i<=3;++i) { int k=b%10; flag[k]++; if(flag[k]>1) return false; b/=10; } for(int i=1;i<=3;++i) { int k=c%10; flag[k]++; if(flag[k]>1) return false; c/=10; } return true; } int main() { int a; for(int i=300;i<=3000;++i) { if(i%6==0) { a=i/6; int b=2*a; int c=3*a; if(judge(a,b,c)) { printf("%d %d %d ",a,b,c); } } } return 0; }
C:找到第一个遗漏的实验
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
小王是北京大学医学部的学生。一天,教授让小王帮忙做一系列的医学实验,实验是从1开始标号的,按照自然数顺序,最大不超过100个。每个实验会得到一张实验结果的表格,表格标号就是实验标号。一个月后,小王做完了所有的实验,但是粗心的小王同学遗失了几张实验结果的表格。小王只能把遗失的实验结果重新做一遍,这时,小王想要知道按照从1开始的自然数顺序里,第一个需要补充做的实验是哪个。
- 输入
- 第一行为一个整数n,代表未遗失的所有实验结果表格的数量
第二行为n个整数,代表未遗失实验结果表格的标号 - 输出
- 输出为1行,输出按照自然数顺序,第一个需要重做的实验。
- 样例输入
-
5 2 1 5 10 11
- 样例输出
-
3
- 提示
- 第二行输入类似 1 2 3 4 5这样从1开始的连续的自然数时,代表第6个实验是第一个需要重做的实验,所以应该输出6。
#include<iostream> using namespace std; #include<cstdio> int n; bool flag[200]={0}; int main() { scanf("%d",&n); for(int i=1;i<=n;++i) { int x; scanf("%d",&x); flag[x]=true; } for(int i=1;i<=2*n;++i) if(!flag[i]) { printf("%d ",i); break; } return 0; }
D:流感传染
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
- 输入
- 第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100. - 输出
- 输出第m天,得流感的人数
- 样例输入
-
5 ....# .#.@. .#@.. #.... ..... 4
- 样例输出
- 16
#include<iostream> using namespace std; #include<cstdio> #define N 150 int jz[N][N]; #include<cstring> int n,m; struct node{ int x,y; }; int xx[]={0,0,1,-1}; int yy[]={1,-1,0,0}; node dl[N*N],dlhb[N*N]; int head=0,tail=0,head1=0,tail1=0; int sum=0; void input() { scanf("%d",&n); for(int i=1;i<=n;++i) { char s[N]; scanf("%s",s+1); for(int j=1;j<=n;++j) { if(s[j]=='.') jz[i][j]=1; if(s[j]=='@') { jz[i][j]=0; ++tail; dl[tail].x=i; dl[tail].y=j; sum++; } if(s[j]=='#') { jz[i][j]=1000000; } } } scanf("%d",&m); } void BFS() { int t=1; while(1) { if(t==m) break; while(head<tail) { ++head; int x1=dl[head].x,y1=dl[head].y; for(int i=0;i<4;++i) { int x2=x1+xx[i],y2=y1+yy[i]; if(x2>=1&&x2<=n&&y2>=1&&y2<=n&&jz[x2][y2]==1) { jz[x2][y2]=0; sum++; ++tail1; dlhb[tail1].x=x2; dlhb[tail1].y=y2; } } } t++; if(t==m) break; while(head1<tail1) { ++head1; int x1=dlhb[head1].x,y1=dlhb[head1].y; for(int i=0;i<4;++i) { int x2=x1+xx[i],y2=y1+yy[i]; if(x2>=1&&x2<=n&&y2>=1&&y2<=n&&jz[x2][y2]==1) { jz[x2][y2]=0; sum++; ++tail; dl[tail].x=x2; dl[tail].y=y2; } } } t++; if(t==m) break; } printf("%d",sum); } int main() { input(); BFS(); return 0; }
E:字符串最大跨距
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目)。如果没有满足条件的S1,S2存在,则输出-1。
例如,S = "abcd123ab888efghij45ef67kl", S1="ab", S2="ef",其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距为:18。 - 输入
- 三个串:S1, S2, S3,其间以逗号间隔(注意,S1, S2, S3中均不含逗号和空格);
- 输出
- S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1。
- 样例输入
-
abcd123ab888efghij45ef67kl,ab,ef
- 样例输出
- 18
#include<iostream> using namespace std; #include<cstdio> #define N 1001 char ss[N+N]; char s[N+10],s1[N/2],s2[N/2]; #include<cstring> int lens,len1=0,len2=0,lenss; void input() { scanf("%s",ss+1); lenss=strlen(ss+1); int i; for(i=1;i<lenss&&ss[i]!=',';++i) s[i]=ss[i]; lens=i; for(i=i+1;ss[i]!=',';++i) { s1[++len1]=ss[i]; } for(i=i+1;ss[i]!='