问题 L: 姓氏
题目描述
在一个很大的课室里,里面有很多学生在听课。L老师挑选了其中的N个不同的学生起立回答问题,L老师对起立的每一个学生都是问同样的问题:“在本课室里,和你同姓的学生有多少人(不包括你自己)?”。这N个起立的同学的回答如下:
第1位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[1]个学生。
第2位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[2]个学生。
第3位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[3]个学生。
。。。。。。
第N位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[N]个同学。
假设这N位同学的回答都是正确的,那么课室里至少有多少个学生?
第1位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[1]个学生。
第2位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[2]个学生。
第3位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[3]个学生。
。。。。。。
第N位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[N]个同学。
假设这N位同学的回答都是正确的,那么课室里至少有多少个学生?
输入
第一行,一个整数N。
第二行,N个整数,空格分开,第i个整数表示A[i]。
第二行,N个整数,空格分开,第i个整数表示A[i]。
输出
一个整数,表示课室里至少有多少个学生。
样例输入 Copy
4
1 2 1 2
样例输出 Copy
5
提示
根据4位学生的回答,可以推断出课室不可能少于5个学生,所以输出5。
对于20%的数据, N = 2,0<=A[i]<=10。
对于另外20%的数据, N = 3, 0<=A[i]<=100。
对于100%的数据,3<N<=50,0<=A[i]<=1000000。
对于20%的数据, N = 2,0<=A[i]<=10。
对于另外20%的数据, N = 3, 0<=A[i]<=100。
对于100%的数据,3<N<=50,0<=A[i]<=1000000。
思路:
1.将N名学生所报数字存入数组,要2个数组,另一个数组要去重的(去重即先排序,把相同的元素去掉)
2.记录去重后的数组中的数在未去重的中的出现的次数
3.举例:如果一个学生报与我姓氏相同的有3个人(除我以外),那么在计数的时候这一个组最多只能容纳4个人,多下来的人分到下一个组
4.在最后算的时候就是取余,除
法一:
1 #include<stdio.h> 2 int main() 3 { 4 long long n,a[2][51],x,i,j,k=0,f,s=0;//二维数组第一行存放和我姓氏相同的人数,第二行存放回答数字相同的个数 5 scanf("%lld",&n); 6 for(i=0;i<n;i++) 7 { 8 scanf("%lld",&x); 9 f=0; 10 for(j=0;j<i;j++) 11 { 12 if(x==a[0][j]) 13 { 14 f=1; 15 a[1][j]++; 16 break; 17 } 18 } 19 if(f==0) 20 { 21 a[0][k]=x; 22 a[1][k++]=1; 23 } 24 } 25 for(i=0;i<k;i++) 26 { 27 if(a[1][i]%(a[0][i]+1)==0) 28 { 29 s=s+(a[0][i]+1)*a[1][i]/(a[0][i]+1); 30 }//假如出现如下情况和我姓氏相同的(不包括我)有2人,那么这个姓氏最多容纳三个人,多的人要算入下一个姓氏 31 32 else 33 s=s+(a[0][i]+1)*(a[1][i]/(a[0][i]+1)+1); 34 printf("%lld",s); 35 } 36 printf("%lld",s); 37 return 0; 38 }
法二:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int a[55],i,j,n,b[55],s=0,count,c[55]; 6 scanf("%d",&n); 7 for(i=0;i<n;i++) 8 { scanf("%d",&a[i]); 9 b[i]=a[i]; 10 } 11 sort(b,b+n); 12 int m=0,k=1; 13 while(k<n) 14 { 15 if(b[k]!=b[m]) b[++m]=b[k]; 16 k++; 17 } 18 for(i=0;i<m+1;i++) 19 { 20 count=0; 21 for(j=0;j<n;j++) 22 { 23 if(b[i]==a[j]) 24 count++; 25 } 26 c[i]=count; 27 } 28 for(i=0;i<m+1;i++) 29 { 30 if(c[i]%(b[i]+1)==0) 31 s=s+(b[i]+1)*(c[i]/(b[i]+1)); 32 else 33 s=s+(b[i]+1)*(c[i]/(b[i]+1)+1); 34 } 35 printf("%d",s); 36 return 0; 37 }

浙公网安备 33010602011771号