第11课 简单的下标计数

第1题     奥运之星 查看测评数据信息

奥林匹克运动是人类社会的一个罕见的杰作,它将体育运动的多种功能发挥得淋漓尽致,影响力远远超出了体育的范畴,在当代世界的政治、经济、哲学、文化、艺术和新闻媒介等诸多方面产生了一系列不容忽视的影响。奥林匹克运动有一句著名的格言:“更快、更高、更强(Citius, Altius, Fortius)”。迄今为止已经奥运会(夏季)已经举办了32届了,在以往的这些盛会中,出现了众多耀眼的体育明星,有人说喜欢菲尔普斯、有人说喜欢博尔特,也有人说喜欢苏炳添……

现在给每个运动员都编上号,然后大家给自己最喜欢的运动员投票,最后通过将得票最多的推选为最受欢迎的奥运之星。因为全球人数太多了,候选人也非常多,通过人力来统计非常麻烦,请你编写程序帮助将奥运之星统计出来,你能做到吗?

输入格式

第一行只有一个数:N(1≤N≤500000),表示参加投票的人数。

第二行有N个正整数,相邻数用空格隔开,所有数均不超过100000,表示这n个人的投票情况。

输出格式

得票最多的那个数,如果有相同得票的,则输出数值较小的那个数。

输入/输出例子1

输入:

9

3 1 2 2 17 1 3 17 3

输出:

3

输入/输出例子2

输入:

5

13 12 14 13 12 

输出:

12

样例解释

样例1:共有9人参与投票,其中编号3得票最多。

#include<bits/stdc++.h>
using namespace std;
int n,a[100010],x,s,ma=-10000;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x;   
        a[x]++;   
    }
    for(int i=1;i<=10000;i++)
       if(a[i]>ma){
           ma=a[i];
           s=i;
       }
    cout<<s;
    return 0;
}

第2题     丢失的同学 查看测评数据信息

XX大学里一共有N个学生,某一天有两个同学外出未归~为了排查到底是哪两个同学,校长让所有在校的同学都去报到,并且签下自己的学号。校长让你写一个程序,计算到底是哪两个同学外出未归呢?

输入格式

第1行为整数N(N<=100000)。以后N-2个整数(均用空格隔开)表示了剩下N-2个同学的学号。学号是从1..N连续编号的。 

输出格式

一行,按学号从小到大顺序输出这两个同学的编号。两个数字之间用一个空格隔开。 

输入/输出例子1

输入:

4 3 1 5 

输出:

2 6

#include<bits/stdc++.h>
using namespace std;
int a[3150];
int main(){
    int n,i,j;
    int m;
    int k;
    int t=0;
    int s;
    scanf("%d",&n);
    for(i=1;i<=n-2;i++){
        scanf("%d",&m);
        k=m/32;
        a[k]=a[k]|(int)pow(2,m%32);
    }
    for(i=0;i<=3150;i++){
        if(t==2)
            break;
        s=i*32;
        for(j=0;j<=31;j++){
            if(t==2)
                break;
            k=a[i]&1;
            if(k==0&&s+j!=0)
            {
                t++;
                printf("%d ",s+j);
            }
            a[i]=a[i]>>1;
        }
    }
    return 0;    
}

第3题     明明的随机数  查看测评数据信息

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤10000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

输入格式

第1行为1个正整数,表示所生成的随机数的个数:N
第2行有N个用空格隔开的正整数,为所产生的随机数。

输出格式

第1行为1个正整数M,表示不相同的随机数的个数。

第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

输入/输出例子1

输入:

10

20 40 32 67 40 20 89 300 400 15

输出:

 8

15 20 32 40 67 89 300 400

#include<stdio.h>
void shuru(int [],int);
void paixu( int [],int);
void shuchu( int [] ,int);
int main(void){
    int n;
    int sz[100];
    scanf("%d",&n);
    shuru(sz,n);
    paixu(sz,n);
    shuchu(sz,n);
    return 0;    

void shuchu(int sz[],int n){
    int i,j,cs=0;
    for(i=0;i<=n;i++){  
        for(j=i+1;j<=n;j++){  
            if(sz[i]!=sz[j]) {  
                cs++;
                i=j;
                continue;  
            }  
        }  
    }  
    printf("%d\n",cs);
    for(i=0;i<=n;i++){  
        for(j=i+1;j<=n;j++){  
            if(sz[i]!=sz[j]){  
                printf("%d ",sz[i]);
                i=j;
                continue;  
            }  
        }  
    }  
}
void paixu(int sz[],int n){
    int i,j ;
    for(i=0;i<n;i++){  
        for(j=i+1;j<n;j++){  
            if(sz[i]>sz[j]){  
                int tmp=sz[i];  
                sz[i]=sz[j];  
                sz[j]=tmp;  
            }  
        }  
    }  
}
void shuru(int sz[],int n){
    int i;
    for(i=0;i<n;i++){
        scanf("%d",&sz[i]);
    }
}

第4题     校门外的树 查看测评数据信息

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。

接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。

输出格式

只包含一个整数,表示马路上剩余的树的数目。

输入/输出例子1

输入:

500 3

150 300

100 200

470 471

输出:

298

#include<stdio.h>  
int main()  {  
    int L,M,i,j,n;  
    int a[10001],b[10001];  
    scanf("%d %d",&L,&M);
    n=M*2;
    for(i=0; i<n; i+=2){  
        scanf("%d %d",&b[i],&b[i+1]);  
    }  
    for(i=0;i<=L;i++){
        a[i]=i;  
    }  
    int r,s;  
    for(i=0;i<n;i+=2){  
        r=b[i];
        s=b[i+1];
        for(j=r;j<=s;j++){  
            a[j]=(-1);  
        }  
    }  
    int k=0;
    for(i=0;i<=L;i++)  {  
        if(a[i]!=(-1)){  
            k++;
        }  
    }  
    printf("%d", k);  
  
    return 0;  

第1题     开会时间 查看测评数据信息

一年一度的信息学奥林匹克总结大会准备召开了,但大会负责人Mr.Huang却遇到了麻烦,参加会议的各中小学信息学教练都非常非常忙,因为他们不但要担任竞赛的辅导工作,而且还有常规的教学工作,有的还担任学校的行政职务,因此要召集他们都来开会是一件非常困难的事,为了让更多的人来参加会议,时间的选择非常关键。因此Mr.Huang让他们每个人交一份空闲时间表(单位:天,最大值为100),他们也只能在空闲的时间才能来开会。Mr.Huang请你通过他们提供的空闲时间表来确定开会的时间(会开1整天)。自然是能来的人越多越好,在这个前提下,请你确定某一天开会,如何能来的人数相同的话,会越早开越好,当然如何与会人数小于组委会设定的最少人数,会议将被取消。

输入格式

第一行为两个正整数N,Q(1≤Q≤N≤50),其中N表示信息学教练的总人数,Q表示至少需要多少信息学教练参加,使得会议能够召开。

接下来有N行,第i行表示第i个教练有空的时间。

输出格式

只有一个整数,为开会的最早时间,如果与会人数少于组委会设定的人数Q,会议被取消,则输出“0”。

输入/输出例子1

输入:

4 3            

4 1 5 8 9     

3 2 5 9

5 2 4 5 7 9

4 2 4 9 15

输出:

9  

样例解释

 4 1 5 8 9   {表示第一个人有4天有空,分别是第1天、第5天、第8天、第9天有空闲}

#include<bits/stdc++.h>
using namespace std;
struct str{
    int cnt,num;
};
bool cmp(str x, str y){
    return x.cnt>y.cnt;
}
str a[105];
int main(){
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        int m;
        cin>>m;
        for(int j=1;j<=m;j++){
            int t;
            cin>>t;
            a[t].cnt++;
            a[t].num=t;
        }
    }
    sort(a+1,a+101,cmp);
    if(a[1].cnt<q){
        cout<<0;
    }
    else cout<<a[1].num;
    return 0;
}

第2题     火灾救援 查看测评数据信息

世界上每天都会有很多灾难,希望这次竞赛对你的自信心不是一个灾难。这次我们要处理的事情,是Fengzee就读的高中起火了,教室里困有大量的学生等待救援。学校里有n名受困学生,分布在m个不同教室里。火灾发生时,这n名聪明的学生每个人用自己手中的移动电话给校长发了一条短信,曰“我在某某教室”。于是,校长总共收到了n条短信息。每条短信息中,都说明了发信学生所在的教室的编号,用1-1000之间的整数表示。现在,这些信息放在你的输入文件中:第1行是一个整数n,表示学生的数目;第2行有n个整数,每个整数分别表示一个学生所在教室的编号,这些数据是无序的。 

现在消防队到了,他们要你写出程序,帮助安排他们的救援顺序。假设每一个教室的危急情况都是一样的,时间也同样紧迫。救援的原则是这样的:第一,受困人数多的教室应当先被救援;第二,假如两个教室的受困学生数相同,你应当先救援编号较小的那个教室,我们称这条规则为“小编号优先原则”。你在输出文件中,应当写入一个方案,其中含有m个数字,相邻两数字间用符号“->”连接,数字的顺序表示救援顺序。 

输入格式

输入文件中:第1行是一个整数n,表示学生的数目;第2行有n个整数,每个整数分别表示一个学生所在教室的编号,这些数据是无序的。

输出格式

输出文件中,应当写入一个方案,其中含有m个数字,相邻两数字间用符号“->”连接,数字的顺序表示救援顺序。

输入/输出例子1

输入:

8

2 7 92 1 1 2 2 92

输出:

2->1->92->7

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1005],k,s,ma,b[10005];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>m;
        a[m]++;
    }
    for(int i=1;i<=1000;i++){
        if(a[i]>0)s++;
    }
    for(int i=1;i<=s;i++){
        ma=0;
        for(int j=1;j<=1000;j++)
        if(a[j]>ma){
           ma=a[j];k=j;
        }
        cout<<k;
        a[k]=0;
        if(i!=s){
           cout<<"->";
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值