Problem A: 老师的点名方案

Description
在大学课堂上有很多课程听课班级和学生都很多,全体点名要花很长时间。因此,老师经常采用部分点名的方法。为了方便,老师做了一个程序可以产生多个随机数x,每个随机数x表示一个学生的序号,这个序号用来点名或者提问某个同学。

现在你做一个程序帮助老师完成这个功能:把一个随机数x转换成一个学生的序号。转换的方案如下:

假设听课的有m个班,一班N1个学生,二班有N2个学生……m班有Nm个学生。那么一班的学生序号为:1~N1;二班的学生序号为1~N2;……m班的学生序号为1~Nm,学生总数sumN=N1+N2+…+Nm。

对于一个随机数x,当x<=sumN时,

x=1是一班1号,x=2是一班2号,……x=N1是一班的N1号(一班的最后一个序号);

x=N1+1是二班1号,x=N1+2是二班2号,……x=N1+N2是二班的N2号(二班的最后一个序号);

x=N1+N2+1是三班1号……

以此类推……

x=sumN是m班的Nm号(m班的最后一个序号),全体同学的最后一个序号;

当x>sumN时,又回来从一班1号开始了:

x=sumN+1是一班1号,x=sumN+N1是一班的N1号;……

x=sumN+N1+1是二班一号,x=sumN+N1+N2是二班的N2号;……

x=sumN+sumN+…+sumN是m班的Nm号,全体同学的最后一个序号;……

按这样顺序把全体学生的序号排成一个圈,任给一个随机数x都可以代表唯一的一个学生序号。这个点名程序就做好了。

Input
输入的第一行为一个正整数m(1<=m<=26),表示有m个班。第二行有m个正整数N1,N2,…Nm,分别表示1班、2班……m班的人数,0<N1,N2,…,Nm<=50。

从第3行开始后的若干行:每行为一个整数,表示老师取得的随机数x,0<x<=10000,至EOF结束。

Output
输出多行,每行与输入的第3行开始对应,格式为:

Class 班号 : num

其中,班号为大写字母A~Z,表示1班~26班。num为被点名学生的(该班级内)序号。例如:

“Class A : 1”表示1班的1号;

“Class C : 10”表示3班的10号。

Sample Input
3
42 39 45
1
43
91
126
168
422
2223
10000
Sample Output
Class A : 1
Class B : 1
Class C : 10
Class C : 45
Class A : 42
Class B : 2
Class B : 39
Class B : 4
答案:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n,i,sum=0,x;
scanf("%d",&m);
int a[50];
for(i=0;i<m;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
while(scanf("%d",&x)!=EOF)
{
if(x%sum!=0)
x%=sum;
else
x=sum;
int num=0;
for(i=0;num<x;i++)
{
num+=a[i];
}
i–;
num-=a[i];
printf(“Class %c : %d\n”,‘A’+i,x-num);

    }
return 0;

}

上一篇:7-6 简单题(天梯赛训练题)


下一篇:2017-2018 ACM-ICPC, NEERC, Moscow Subregional Contest Problem G