问题 L: 姓氏

问题 L: 姓氏

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

在一个很大的课室里,里面有很多学生在听课。L老师挑选了其中的N个不同的学生起立回答问题,L老师对起立的每一个学生都是问同样的问题:“在本课室里,和你同姓的学生有多少人(不包括你自己)?”。这N个起立的同学的回答如下:
第1位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[1]个学生。
第2位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[2]个学生。
第3位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[3]个学生。
。。。。。。

第N位起立的同学回答:和我同姓的,除了我之外,本课室里还有A[N]个同学。
假设这N位同学的回答都是正确的,那么课室里至少有多少个学生?
 

输入

第一行,一个整数N。
第二行,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。
 思路:
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     }

 

posted @ 2020-11-07 23:36  瑜瑜子  阅读(261)  评论(0)    收藏  举报