第1题 铅笔 时限:1s 空间:256m
桌面有n个盒子,第i个盒子有a[i]支铅笔。
你想要得到尽量多的铅笔,但是如果某两个盒子有相同数量的铅笔,那么你是不能同时拥有这两个盒子的。
问你最多可以得到多少支铅笔。
输入格式
第一行,一个整数n。 1<=n<=50。
第二行,n个整数,第i个整数是a[i]。 1<=a[i]<=10。
输出格式
一个整数。
输入/输出例子1
输入:
4
5 2 5 3
输出:
10
输入/输出例子2
输入:
3
5 5 5
输出:
5
#include<bits/stdc++.h>
using namespace std;
long long n,t,a[1000005],s;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>t;
a[t]=1;
}
for(int i=1;i<=50;i++){
if(a[i]==1)s+=i;
}
cout<<s;
return 0;
}
第2题 号码牌 时限:5s 空间:256m
张老师班上有 N 位同学参加秋季运动会,老师为同学们定制了比赛专属号码牌,编号为 1∼N。
生产号码牌的商家发货后,张老师发现号码牌少了 1 个号码,但是统计后发现,确实有 N 个号码牌,且所有号码牌的编号都在 [1,N]的范围内,但是有一个号码被错误的印刷成了另一个号码。
请编程帮老师找出这些号码牌中,缺失的号码和被错误印刷了 2次的号码。
输入格式
第 1 行读入整数 N,代表号码牌的数量;
第 2行读入 N 个号码,用空格隔开。
输出格式
输出 2 个整数,用空格隔开,第 1 个整数,代表缺失的号码,第 2 个整数代表被印刷了 2 次的号码。
输入/输出例子1
输入:
6
2 1 5 2 4 6
输出:
3 2
样例解释
数据范围
对于 100%的测试数据,满足 5≤N≤100000;
所有测试点均满足读入的 N 个号码牌的数值均在 [1,N] 的范围内,且缺失的号码牌及被错误印刷 2次的号码牌均是唯一的。
#include<bits/stdc++.h>
using namespace std;
long long n,a[100000+5],b[100000+5],x,x1;
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
b[a[i]]++;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
if(b[i]==0)x=i;
if(b[i]==2)x1=i;
}
cout<<x<<" "<<x1;
return 0;
}
第3题 侦察 时限:1s 空间:256m
小红通过简单的计算就求出了密码打开了沙盘,于是双方使用沙盘进行了攻城模拟。现在小红有n个侦察兵,要从两支部队选派2个侦察兵去侦察小蓝部队驻守的城市。为了使得侦察兵能更好配合完成工作,小红认为这2个侦察兵所在的部队编号必须相差为m。
现在已知n个侦察兵的部队编号,请问小红有多少不同的选择方案(同一部队的不同士兵视为同一方案)?
输入格式
第1行,2个整数n,m(2<=n<=100000,1<=m<=50)。
第2行,n个整数,第i个整数表示第i个侦察兵的部队编号(1<=部队编号<=1000)。
输出格式
一个整数,表示不同的方案数。
输入/输出例子1
输入:
5 6
1 7 2 8 12
输出:
2
输入/输出例子2
输入:
6 8
1 1 9 9 2 8
输出:
1
样例解释
样例1解释:第1个侦察兵可以跟第2个侦察兵搭档,第3个侦察兵可以跟第4个侦察兵搭档,所以有2种不同选择方案。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
int a[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);
int len=unique(a+1,a+n+1)-a;
int count=0;
for(int i=1;i<len;i++){
for(int j=i+1;j<=len;j++){
if(a[j]-a[i]==k){
count++;
break;
}
}
}
cout<<count;
return 0;
}
第4题 战功 时限:1s 空间:256m
通过侦察,小红已经基本了解了对方的兵力部署情况,现在派遣特种部队进攻小蓝的模拟城市。通过几十分钟的攻守战模拟,小红的特种部队顺利攻下了小蓝的A城。在战斗中,每个模拟士兵都立下不小战功。现在小红想根据每个士兵的战功排名来论功行赏。
例如有四名士兵,战功值分别为50、80、50、30分,则80分的士兵为第一名,50分的两名士兵均为第二名,30分的士兵为第四名。
请你编写一个程序,计算每个士兵在这种排名方式之下的名次。
输入格式
第一行为一个整数n,表示参战的士兵数,1<=n<=1000000,第二行为n个整数,表示每位士兵的战功值(战功值<=1000000)。
输出格式
一行,表示每位士兵的名次,一个空格隔开。
输入/输出例子1
输入:
4
50 80 50 30
输出:
2 1 2 4
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000005],b[1000005],maxx=0,minn=1000005,xx=1,x;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
b[a[i]]++;
maxx=max(maxx,a[i]),minn=min(minn,a[i]);
}
for(int i=maxx;i>=minn;i--){
if(b[i]>=1){
x=b[i];
b[i]=xx;
xx+=x;
}
}
for(int i=1;i<=n;i++){
cout<<b[a[i]]<<" ";
}
return 0;
}
第5题 社团交集 时限:5s 空间:256m
HJ小学信息学社团每个同学都有且仅有一个数字编号(1~1000),现在帅气的吴老师准备举办n个学习项目,信息学社团的每个同学都参加项目且可以参加多个项目。问:同时参加所有项目的同学有哪些?请从小到大输出他们的编号。
输入格式
第一行有1个正整数n(1<=n<=100)表示有n个学习项目。
接下来的n行每行第一个整数ki(1<=ki<=1000)表示第i个项目的同学人数,后面有ki个正整数,表示项目中同学的编号(不超过1000)。
输出格式
输出同时参加所有项目的同学的编号,从小到大。
输入/输出例子1
输入:
3
5 6 2 8 3 9
4 1 2 3 6
4 6 8 2 1
输出:
2 6
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100005],b[100005];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>m;
for(int j=1;j<=m;j++){
cin>>a[i];
b[a[i]]++;
}
}
for(int i=1;i<=1000;i++){
if(b[i]==n)cout<<i<<" ";
}
return 0;
}
第6题 优秀的作品 时限:5s 空间:256m
博爱小学举办书法大赛,学校一共收到了 N 个同学的作品,并给作品编号 1∼N。
这 N幅作品被放到了学校的展厅展览,并请全校同学进行公开投票。投票结束,学校收到了 M张投票,每张投票投给了 1幅参赛的作品;学校预计评比出一等奖、二等奖、三等奖 各 1名;
由于可能存在多个优秀作品得票数相同的情况,因此最终实际获奖名额可能会比预计多,这种情况下,学校会增加相应奖项等级的获奖名额。
比如,如果有 3位同学得票数并列第 1,这种情况学校会颁发出 3 个一等奖。
请编程统计出一等奖、二等奖、三等奖获奖作品的编号。
输入格式
第 1行读入 2 个整数 N 和 M,分别代表参赛作品的数量和投票的数量;
第 2行读入 M 个整数,第 i 个整数 Ai 代表了第 i张投票投给了编号为 Ai 的作品。
输出格式
输出 3 行,每行输出若干整数,用空格隔开;
第 1 行输出一等奖获奖作品的编号,第 2 行输出二等奖获奖作品的编号,第 3行输出三等奖获奖作品的编号;
如果某个奖项有多个作品获得,那么该奖项的获奖作品编号按照编号值从小到大的顺序输出。
输入/输出例子1
输入:
8 15
3 3 3 4 4 4 6 6 8 8 7 7 5 1 2
输出:
3 4
6 7 8
1 2 5
输入/输出例子2
输入:
10 16
6 5 7 2 2 1 1 7 4 2 2 7 7 2 4 4
输出:
2
7
4
样例解释
3 号作品和 4 号作品各获得 3票,并列第 1,评选为一等奖;
6 号作品、8 号作品、7 号作品各获得 2 票,并列第 2 ,评选为二等奖;
5 号作品、1 号作品、2 号作品各获得 1 票,并列第 3 ,评选为三等奖;
数据范围
对于 100%的数据,6≤N,M≤100000,1≤Ai≤N;
测试数据确保统计后一等奖、二等奖、三等奖至少各有 1 人。
#include<bits/stdc++.h>
using namespace std;
long long n,m,t,a[100005],maxx1,maxx2,maxx3;
int main(){
scanf("%lld%lld",&m,&n);
for(int i=1;i<=n;i++){
scanf("%lld",&t);
a[t]++;
}
for(int i=1;i<=m;i++){
maxx1=max(maxx1,a[i]);
}
for(int i=1;i<=m;i++){
if(a[i]!=maxx1){
maxx2=max(maxx2,a[i]);
}
}
for(int i=1;i<=m;i++){
if(a[i]!=maxx1&&a[i]!=maxx2){
maxx3=max(maxx3,a[i]);
}
}
for(int i=1;i<=m;i++){
if(a[i]==maxx1){
cout<<i<<" ";
}
}
cout<<'\n';
for(int i=1;i<=m;i++){
if(a[i]==maxx2){
cout<<i<<" ";
}
}
cout<<'\n';
for(int i=1;i<=m;i++){
if(a[i]==maxx3){
cout<<i<<" ";
}
}
return 0;
}
第7题 餐饮服务质量打分 时限:1s 空间:256m
假设有40个学生被邀请来给餐厅的饮食和服务质量打分,分数划分为1~10这10个等级(1表示最低分,10表示最高分),编程统计并如下格式输出餐饮服务质量调查结果。
Grade Count Histogram
1 5 *****
2 10 **********
3 7 *******
···
输入格式
40个数。
输出格式
11行。Grade、Count、Histogram和各个数据都占一个制表符(8位)。
输出格式:printf("%-8d%-8d",i,a[i]);
输入/输出例子1
输入:
5 7 9 8 7 6 8 9 10 7
9 5 8 10 9 6 8 5 9 7
6 10 5 9 8 9 7 7 9 8
8 6 9 9 9 8 8 7 9 5
输出:
Grade Count Histogram
1 0
2 0
3 0
4 0
5 5 *****
6 4 ****
7 7 *******
8 9 *********
9 12 ************
10 3 ***
#include<bits/stdc++.h>
using namespace std;
int x,a[15];
int main(){
for(int i=0;i<40;i++){
cin>>x;
a[x]++;
}
printf("Grade count Histogram\n");
for(int i=1;i<=10;i++){
printf("%-8d%-8d",i,a[i]);
for(int j=0;j<a[i];j++)cout<<"*";
cout<<'\n';
}
return 0;
}
第8题 集卡册 时限:1s 空间:256m
小胡喜欢收集奥特曼卡片,对每个奥特曼的技能,身高,体重都如数家珍。
为了能把这些卡片带给小伙伴们炫耀,他还特地买了一本集卡册。集卡册一共能装 16 张卡片,每次出门他都会装满这本集卡册,但是有时粗心的小胡会放入两张相同的卡片。
如下所示:
上面每个大写字母代表一种卡片,其中第一张和第五张相同。
输入格式
输入 16个连续的大写字母,代表放入的 16 张卡片的种类。
输出格式
如果 16 张卡片各不相同,输出 different。
如果有 2张卡片的种类一样,以由小到大的顺序输出 2 张相同卡片的编号, 2 个位置序号之间以空格隔开。
输入/输出例子1
输入:
BCDEGHJKLBAUIOPQ
输出:
1 10
输入/输出例子2
输入:
ABCDEFGHIJKLMNOP
输出:
different
样例解释
【样例 1 解释】
十六张卡片中第一张和第十张都是 B,所以答案是 1 10。
【数据说明】
相同的卡片最多只会有一种,且最多只有2 张。
#include<bits/stdc++.h>
using namespace std;
string s;
long long s1=0,a[3];
bool f=0;
int main(){
cin>>s;
for(long long i=0;i<s.size();i++){
for(long long j=i+1;j<s.size();j++){
if(s[i]!=s[j]){
f=1;
}
else {
cout<<i+1<<" "<<j+1;
return 0;
}
}
}
if(f)printf("different");
return 0;
}
第9题 三连击 时限:1s 空间:256m
将 1,2,…,9共 9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!。
输入格式
三个数,A,B,C (A<B<C)。
输出格式
若干行,每行 3个数字。按照每行第一个数字升序排列。
输入/输出例子1
输入:
1 2 3
输出:
192 384 576
219 438 657
273 546 819
327 654 981
输入/输出例子2
输入:
1 4 6
输出:
No!!!
#include<bits/stdc++.h>
using namespace std;
long long a[1000005],s1,s2,s3,l,x1,x2,x3,s;
int main (){
cin>>x1>>x2>>x3;
for(int i=1;i<=1000/x3;i++){
s1=i*x1,s2=i*x2,s3=i*x3;
if(s2>999||s3>999){
break;
}
for(int j=1;j<=3;j++){
a[s1%10]++;
s1/=10;
}
for(int j=1;j<=3;j++){
a[s2%10]++;
s2/=10;
}
for(int j=1;j<=3;j++){
a[s3%10]++;
s3/=10;
}
for(int j=1;j<=9;j++){
if(a[j]!=1){
l=1;
break;
}
}
for(int j=1;j<=9;j++){
a[j]=0;
}
if(!l){
cout<<i*x1<<' '<<i*x2<<' '<<i*x3<<'\n';
s++;
}
else l=0;
}
if(!s)cout<<"No!!!";
return 0;
}