信息学选拔测试(C++)

第1题     勇士     时限:1s 空间:256m

小明在学习信息学编程时,设计了一款游戏:初始时勇士的能力值为n,通往城堡的路上有m个挑战者,第i个挑战者的能力值为a[i]。勇士只能按照顺序依次迎战挑战者。当勇士的能力值大于等于挑战者时,视为勇士胜利,可以继续迎战下一位,否则视为失败,游戏直接结束。现在请你找出勇士在失败或全部通关后,他击败的挑战者里最强那位的能力值是多少。若一个都无法击败,则输出0。

输入格式

第一行,两个整数n和m。

第二行,m个整数,第i个整数为第i个挑战者的能力值a[i]。

输出格式

输出一个整数,为勇士在失败或全部通关后,他击败的挑战者里最强那位的能力值。

输入/输出例子1

输入:

100 4

98 77 123 56

输出:

98

输入/输出例子2

输入:

130 4

98 77 123 56

输出:

123

样例解释

【样例说明】

样例1中,勇士的能力值是100,共有4位挑战者,能力值分别为98、77、123、56。勇士能够击败第1、2位挑战者,但无法击败第3位,因此在他击败的挑战者里,最强那位的能力值是98。

样例2中,勇士的能力值是130,共有4位挑战者,能力值分别为98、77、123、56。勇士能够击败所有的挑战者,因此在他击败的挑战者里,最强那位的能力值是123。

【数据范围】

对于100%的数据,1≤n,m,a[i]≤10000。

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[10005],maxx=0; 
int main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%lld",&a[i]);
		if(n>=a[i]){
			if(a[i]>maxx)maxx=a[i];
		}
		else break;
	}
	printf("%lld",maxx);
    return 0;
}

第2题     体重     时限:1s 空间:256m

 A 一觉醒来发现时空发生了穿越,来到了秦始皇一统天下后的时代。

 A 想进城逛逛,但是守城人要求必须报上自己的身高体重。 但是当时的秤是十六两一斤,小A只知道自己用十两一斤的秤称重时的斤两。

请你帮他算算应该如何上报数据。

输入格式

输入十两一斤的重量数,输入有两行。

第一行是斤数。 第二行是两数。

输出格式

输出对应十六两一斤秤的重量数,输出有两行。

第一行是斤数。

第二行是两数。

输入/输出例子1

输入:

2

1

输出:

1

5

输入/输出例子2

输入:

10

9

输出:

6

13

样例解释

样例1说明

在十两一斤的称重下,有 2 斤 1 两,共 21 两。

因此换算为十六两一斤的称重下,有 1 5两。

数据范围

对于 100%的数据,满足读入的斤数,在 [0,1000]的范围,读入的两数,在 [0,9]的范围。

#include<bits/stdc++.h>
using namespace std;
long long n,m,shi=0,shiliujing=0,shiliuliang=0; 
int main(){
	scanf("%lld%lld",&n,&m);
	shi=n*10+m;
	shiliujing=shi/16;
	shiliuliang=shi%16;
	printf("%lld\n%lld",shiliujing,shiliuliang);
    return 0;
}

第3题     打怪兽     时限:5s 空间:256m

3只怪兽,第i只怪兽的能量是a[i]。

你要消灭这3只怪兽,需要进行3轮。

1轮,你可以选择任何一只怪兽(不妨假设你选了第i只怪兽),然后消灭它,代价是0元。

2轮,你从剩下的两只怪兽中选择任意的一只怪兽(不妨假设你选了第j只怪兽),代价是abs(a[i]-a[j])。

3轮,消灭剩下的那只怪兽(不妨假设是第k只怪兽),代价是abs(a[j]-a[k])。

你的目标是最小化总代价。

输入格式

3个整数, a[1],a[2],a[3],  1<=a[1],a[2],a[3]<=100000。

输出格式

一个整数。

输入/输出例子1

输入:

1 6 3

输出:

5

样例解释

abs(a[i]-a[j])(a[i]-a[j])的绝对值,即较大值与较小值的差,如abs(2,5)=3.

#include<bits/stdc++.h>
using namespace std;
long long n=3,a[4],s=0;
int main(){
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	sort(a+1,a+n+1);
	s=abs(a[3]-a[2])+abs(a[2]-a[1]);
	printf("%lld",s);
    return 0;
}

第4题     集卡册     时限:1s 空间:256m

小胡喜欢收集奥特曼卡片,对每个奥特曼的技能,身高,体重都如数家珍。

为了能把这些卡片带给小伙伴们炫耀,他还特地买了一本集卡册。集卡册一共能装 16 张卡片,每次出门他都会装满这本集卡册,但是有时粗心的小胡会放入两张相同的卡片。

如下所示:

image.png

上面每个大写字母代表一种卡片,其中第一张和第五张相同。

输入格式

输入 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;
}

第5题     有趣的横幅     时限:1s 空间:256m

小胡准备做一个广告横幅为公司宣传。为了让所有人都印象深刻,所以他把横幅做的特别长,但是他想不出那么长的广告语,所以他决定把公司名称 DFBY 不断重复循环。所以最终呈现给大家的就是一个无限循环的横幅: DFBYDFBYDFBYDFBY...

现在告诉我们一个整数x, 请问这个横幅上的第个字符是哪个字母?

输入格式

输入一个整数x

输出格式

输出横幅的第x个字母。

输入/输出例子1

输入:

5

输出:

D

输入/输出例子2

输入:

12

输出:

Y

样例解释

【数据范围】

对于 100%的数据,1≤x≤1,000,000,000

#include<bits/stdc++.h>
using namespace std;
long long n;
int main(){
	scanf("%lld",&n);
	if(n%4==1){
		cout<<"D";
		return 0;
	}
	else if(n%4==2){
		cout<<"F";
		return 0;
	}
	else if(n%4==3){
		cout<<"B";
		return 0;
	}
	else if(n%4==0){
		cout<<"Y";
		return 0;
	}
    return 0;
}

第6题     数字谜题     时限:1s 空间:256m

乐乐的《趣味数学》书上有这样一个数学谜题:

 N个整数,请按下列步骤寻找符合要求的数字:

将每个数的每一位拆出来后,统计出一共有多少位数字的值除以 3 的余数为 0;

统计结束后,如果统计的结果是偶数,那么这个数就是符合要求的数字;

请将所有符合要求的数字按照从小到大的顺序排序后输出;

乐乐觉得一个一个找实在是太慢了,他决定请学过编程的你帮忙写一个程序,帮他快速的找出答案。

输入格式

 1 行读入一个整数 N,代表要读入数字的数量;

 2 行读入 N 个整数,用空格隔开;

输出格式

输出若干行,每行一个整数,按照从小到大的顺序,输出所有符合要求的数字。

输入/输出例子1

输入:

8

138 290 3589 230 62 882 981 12000

输出:

230

290

882

3589

输入/输出例子2

输入:

10

16716 14533 2394 29326 26186 31867 10090 22792 31775 15732 

输出:

2394

10090

14533

16716

26186

31867

样例解释

样例 1 解释

读入的数据中,290、3589、230、882,均是满足条件的整数,以 290为例:数字 290中,9和 0除以 3余数都为 0,因此 290各个位中有 2 位数除以 3 的余数为 0,符合题目要求的统计结果为偶数的要求。

数据范围

对于 100%的数据 1≤N≤10000,第二行读入的每个数 Ai所在的范围为 1≤Ai≤1000000。

#include<bits/stdc++.h>
using namespace std;
long long n,a[10005],sum=0,b[10005],t,ans;
int main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		t=a[i];
		while(t>0){
			if(t%10%3==0)ans++;
			t/=10;
		}
		if(ans%2==0){
			sum++;
			b[sum]=a[i];
		}
		ans=0;
	}
	sort(b+1,b+sum+1);
	for(int i=1;i<=sum;i++){
		printf("%lld\n",b[i]);
	}	
    return 0;
}

第7题     鼠鼠的薪水     时限:1s 空间:256m

浪浪国的鼠鼠阿胡是一只新上任的公务鼠,它的职责是看管粮仓。

鼠鼠它每天都会吃掉根玉米,每个星期一会拿到根玉米作为薪水。但是贪心的鼠鼠怎么会就此满足呢,所以每个星期二它还会偷偷往家拿根玉米。

虽然鼠鼠非常精明,但是纸是包不住火的,终究还是东窗事发了。鼠鼠被抄家时,从它的被窝里找出了根玉米,已知它上任前家里一共有 10 根玉米,请问从星期三上任到被捕入狱,它一共当了几天公务鼠呢?

请注意:鼠鼠被抓的当天,还没有来得及享受美味的玉米,被抓的当天不能算在它作为公务鼠的统计天数内。

输入格式

输入一个整数 n ,表示剩下的玉米数量。

输出格式

输出一个整数,表示当公务鼠的天数。

输入/输出例子1

输入:

17

输出:

7

输入/输出例子2

输入:

23

输出:

15

样例解释

【样例 1解释】

原先有 10 根玉米,周三作为第一天。

第一天吃完还剩 9根。

第二天吃完还剩 8 根。

依次类推,到第五天吃完,还剩根。

第六天因为是周一,发了根,吃了根,所以还剩11 根。

第七天是周二,偷了根,吃了根,所以还剩17 根。

第八天被抓了,所以实际只当了天的公务鼠。

【数据范围】

5≤n≤5000

#include<bits/stdc++.h>
using namespace std;
long long n,s=10,ans=0;
int main(){
	scanf("%lld",&n);
	for(long long i=3;;i++){
		if(i==8)i=1;
		if(i>=1&&i<3)s+=6,ans++;
		if(i>=3&&i<=7)s--,ans++;
		if(s==n){
			cout<<ans;
			return 0;
		}
	}
    return 0;
}

第8题     欢乐的跳     时限:1s 空间:256m

一个 n个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了 [1,n−1]之间的所有整数,则称之符合“欢乐的跳”,如数组 {1,4,2,3}符合“欢乐的跳”,因为差的绝对值分别为:3,2,1。

给定一个数组,你的任务是判断该数组是否符合“欢乐的跳”。

输入格式

每组测试数据第一行以一个整数 n(1≤n≤1000)开始,接下来n个空格隔开的在 [−108,108]之间的整数。

输出格式

对于每组测试数据,输出一行若该数组符合“欢乐的跳”则输出 Jolly,否则输出 Not jolly

输入/输出例子1

输入:

4 1 4 2 3

输出:

Jolly

输入/输出例子2

输入:

5 1 4 2 -1 6

输出:

Not jolly

#include<bits/stdc++.h>
using namespace std;
int a[1005],b[1005];
int main(){
    int n;
	scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=1;i<n;i++){
        b[i]=abs(a[i]-a[i+1]);
    }
    sort(b+1,b+n);
    for(int i=1;i<n;i++){
        if(b[i]!=i){
            printf("Not jolly");
			return 0;
        }
    }
    printf("Jolly");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值