CCF GESP C++ 三级上机题

https://www.luogu.com.cn/problem/B3848

https://www.luogu.com.cn/problem/B3849

https://www.luogu.com.cn/problem/B3842

https://www.luogu.com.cn/problem/B3843

https://www.luogu.com.cn/problem/B3867

https://www.luogu.com.cn/problem/B3868

https://www.luogu.com.cn/problem/B3925

https://www.luogu.com.cn/problem/B3926

1.[GESP样题 三级] 逛商场

题目描述

小明是个不太有计划的孩子。这不,刚到手的零花钱,就全部拿着逛商场去了。

小明的原则很简单,见到想买的物品,只要能买得起,就一定会买下来之后才会继续往前走;如果买不起就直接跳过。

一天下来,小明到底买了多少物品呢?

输入格式

输入共 33 行:

第一行是一个整数 �N,表示商场中共有 �N 种小明想买的物品(1≤�≤1001≤N≤100);

第二行共有 �N 个整数,分别表示小明先后见到想买的物品的价格;

第三行是一个整数 �X,表示开始时小明共有 �X 元零花钱。

输出格式

输出 11 行,包含一个整数,表示小明买到的物品数。

输入输出样例

输入 #1

6
7 5 9 10 7 4
30

输出 #1

4

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[100005],x,ans=0;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	cin>>x;
	for(int i=1;i<=n;i++){
		if(a[i]<=x){
			x-=a[i];
			ans++;
		}	
		else continue;
	}
	cout<<ans<<"\n";
	return 0;
}

2.[GESP样题 三级] 进制转换

题目描述

小美刚刚学习了十六进制,她觉得很有趣,想到是不是还有更大的进制呢?在十六进制中,用 A 表示 1010、F 表示 1515。如果扩展到用 Z 表示 3535,岂不是可以表示 3636 进制数了嘛!

所以,你需要帮助她写一个程序,完成十进制转 �R 进制(2≤�≤362≤R≤36)的工作。

输入格式

输入两行,第一行包含一个正整数 �N,第二行包含一个正整数 �R,保证 1≤�≤1061≤N≤106。

输出格式

输出一行,为 �N 的 �R 进制表示。

输入输出样例

输入 #1

123
25

输出 #1

4N

AC代码:

#include<bits/stdc++.h>
using namespace std;
char a[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
void convert(int x,int n){
    if(x==0)
        return;
    convert(x/n,n);
    cout<<a[x%n];
}
int main(){	
    int x,n;
    cin>>x>>n;;  
    if(x==0)
        cout<<"0\n";
    else
        convert(x, n);
    cout<<"\n"; 
    return 0;
}

3.[GESP202306 三级] 春游

题目描述

老师带领同学们春游。已知班上有 �N 位同学,每位同学有从 00 到 �−1N−1 的唯一编号。到了集合时间,老师确认是否所有同学都到达了集合地点,就让同学们报出自己的编号。到达的同学都会报出自己的编号,不会报出别人的编号,但有的同学很顽皮,会多次报出。你能帮老师找出有哪些同学没有到达吗 ?。

输入格式

输入包含 22 行。第一行包含两个整数 �N 和 �M,表示班级有 �N 位同学,同学们共有 �M 次报出编号。约定 2≤�,�≤10002≤N,M≤1000。
第二行包含 �M 个整数,分别为 �M 次报出的编号。约定所有编号是小于 �N 的非负整数。

输出格式

输出一行。如果所有同学都到达,则输出 �N;否则由小到大输出所有未到达的同学编号,空格分隔。

输入输出样例

输入 #1

3 3
0 2 1

输出 #1

3

输入 #2

3 5
0 0 0 0 0

输出 #2

1 2

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1001],b[1001],c[1001],q=1;
int main(){
	cin>>n>>m;
	for(int i=0;i<m;i++){ 
		cin>>a[i];
	}
	for(int i=0;i<n;i++){ 
		b[i]=i;
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			if(b[i]==a[j]){
				c[i]=1;
			}
		}
	}
	for(int i=0;i<n;i++){ 
		if(c[i]!=1){
			cout<<b[i]<<" ";
			q=0;
		}
	}
	if(q!=0){
		cout<<n;
	}
	
}

4.[GESP202306 三级] 密码合规

题目描述

网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求 :。

  1. 只能由 a∼za∼z 之间 2626 个小写字母、A∼ZA∼Z 之间 2626 个大写字母、0∼90∼9 之间 1010 个数字以及 !@#$ 四个特殊字符构成。

  2. 密码最短长度 :6:6 个字符,密码最大长度 :12:12 个字符。

  3. 大写字母,小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。

输入格式

输入一行不含空格的字符串。约定长度不超过 100100。该字符串被英文逗号分隔为多段,作为多组被检测密码。

输出格式

输出若干行,每行输出一组合规的密码。输出顺序以输入先后为序,即先输入则先输出。

输入输出样例

输入 #1复制

seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

输出 #1复制

seHJ12!@
sjdkffH$123

说明/提示

【样例 1 解释】

输入被英文逗号分为了四组被检测密码:seHJ12!@sjdkffH$123sdf!@&12HDHa!123&^YUhg@!。其中 sdf!@&12HDHa! 长度超过 12 个字符,不合规;123&^YUhg@! 包含四个特殊字符之外的字符不合规。

AC代码:

#include <iostream>
#include <string>
using namespace std;
bool b[10];
int a[10];
int _end[10],start[10];


bool B3843(int start,int end_,int len,string str) {
    bool boo[4] = {0};// here 1
    if(len > 12 || len < 6) {
        return false;
    }
    
    // here 2
    for(int i = start + 1; i <= end_; i++) {
        if(str[i] >= '0' && str[i] <= '9') {
            boo[0] = true;
        }
        else if(str[i] >= 'A' && str[i] <= 'Z') {
            boo[1] = true;
        }
        else if(str[i] >= 'a' && str[i] <= 'z') {
            boo[2] = true;
        }
        else if(str[i] == '!' || str[i] == '#' || str[i] == '@' || str[i] == '$') {
            boo[3] = true;
        }
        else {
            return false;
        }
    }
    if(boo[3] == false) {
        return false;
    }
    if(boo[0] + boo[1] + boo[2] < 2) {
        return false;
    }
    return true;
}

int main() {
    string str;
    cin >> str;
    start[0] = 0;
    int sum = 0;
    long long len = str.length();
    for(int i = 0; i < len; i++) {
        if(str[i] == ',') {
            _end[sum] = i - 1;
            b[sum] = B3843(start[sum],_end[sum],_end[sum] - start[sum] + 1,str);
            start[++sum] = i + 1;
        }
    }
    _end[sum] = len - 1;
    b[sum] = B3843(start[sum],_end[sum],_end[sum] - start[sum] + 1,str); 
    for(int i = 0; i <= sum; i++) { // ´Ó0µ½4£¬¹²5¸ö
        if(b[i] == true) {
            for(int j = start[i]; j <= _end[i]; j++) {
                cout << str[j];
            }
            cout << endl;
        }
    }
}

5.[GESP202309 三级] 小杨的储蓄

题目描述

小杨共有 �N 个储蓄罐,编号从 00 到 �−1N−1。从第 11 天开始,小杨每天都会往存钱罐里存钱。具体来说,第 �i 天他会挑选一个存钱罐 ��ai​,并存入 �i 元钱。过了 �D 天后,他已经忘记每个储蓄罐里都存了多少钱了,你能帮帮他吗?

输入格式

输入 22 行,第一行两个整数 �,�N,D;第二行 �D 个整数,其中第 �i 个整数为 ��ai​(保证 0≤��≤�−10≤ai​≤N−1)。

每行的各个整数之间用单个空格分隔。

保证 1≤�≤1,0001≤N≤1,000;1≤�≤1,0001≤D≤1,000。

输出格式

输出 �N 个用单个空格隔开的整数,其中第 �i 个整数表示编号为 �−1i−1 的存钱罐中有多少钱(�=1,⋯ ,�i=1,⋯,N)。

输入输出样例

输入 #1

2 3
0 1 0

输出 #1

4 2

输入 #2

3 5
0 0 0 2 0

输出 #2

11 0 4

说明/提示

样例解释 1:

小杨在第 11 天、第 22 天、第 33 天分别向 00 号、 11 号、 00 号存钱罐存了 11 元钱、 22 元钱、 33 元钱,因此 00 号存钱罐有 1+3=41+3=4 元钱,而 11 号存钱罐有 22 元钱。

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,d;
signed main() {
	cin>>n>>d;
	int s[n]= {0},a;
	for(int i=0; i<d; i++) {
		cin>>a;
		s[a]+=i+1;
	}
	for(int i=0; i<n; i++) {
		cout<<s[i]<<" ";
	}
	return 0;
}

6.[GESP202309 三级] 进制判断

题目描述

�N 进制数指的是逢 �N 进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母 A 至 F 表示十至十五)。

现在有N个数,请你分别判断他们是否可能是二进制、八进制、十进制、十六进制。例如,15A6F 就只可能是十六进制,而 1011 则是四种进制皆有可能。

输入格式

输入的第一行为一个十进制表示的整数 �N。接下来 �N 行,每行一个字符串,表示需要判断的数。保证所有字符串均由数字和大写字母组成,可能以 00 开头。保证不会出现空行。

保证 1≤�≤10001≤N≤1000,保证所有字符串长度不超过 1010。

输出格式

输出 �N 行,每行 44 个数,用空格隔开,分别表示给定的字符串是否可能表示一个二进制数、八进制数、十进制数、十六进制数。使用 11 表示可能,使用 00 表示不可能。

例如,对于只可能是十六进制数的 15A6F,就需要输出 0 0 0 1;而对于四者皆有可能的 1011,则需要输出 1 1 1 1

输入输出样例

输入 #1

2
15A6F
1011

输出 #1

0 0 0 1
1 1 1 1

输入 #2

4
1234567
12345678
FF
GG

输出 #2

0 1 1 1
0 0 1 1
0 0 0 1
0 0 0 0

AC代码:

#include<bits/stdc++.h>
using namespace std;
string str;
int n;
int main(){
	cin>>n;
	while(n--){
		cin>>str;
		bool flag[4]={true,true,true,true};
		for(int i=0;i<str.size();i++){
			if(str[i]>'1'){
			    flag[0]=false;
			}
			if(str[i]>'7'){
			    flag[1]=false;
			}
			if(str[i]>'9'){
			    flag[2]=false;
			}
			if(str[i]>'F'){
			    flag[3]=false;
			}
		}
		for(int i=0;i<4;i++){
		    cout<<int(flag[i])<<" ";
		}
		cout<<endl;
	}
    return 0;
}

7.[GESP202312 三级] 小猫分鱼

题目描述

海滩上有一堆鱼,�N 只小猫来分。第一只小猫把这堆鱼平均分为 �N 份,多了 �<�i<N 个,这只小猫把多的 �i 个扔入海中,拿走了一份。第二只小猫接着把剩下的鱼平均分成 �N 份,又多了 �i 个,小猫同样把多的 �i 个扔入海中,拿走了一份。第三、第四、……,第 �N 只小猫仍是最终剩下的鱼分成 �N 份,扔掉多了的 �i 个,并拿走一份。

编写程序,输入小猫的数量 �N 以及每次扔到海里的鱼的数量 �i,输出海滩上最少的鱼数,使得每只小猫都可吃到鱼。

例如:两只小猫来分鱼 �=2N=2,每次扔掉鱼的数量为 �=1i=1,为了每只小猫都可吃到鱼,可令第二只小猫需要拿走 11 条鱼,则此时待分配的有 33 条鱼。第一只小猫待分配的鱼有 3∗2+1=73∗2+1=7 条。

输入格式

总共 22 行。第一行一个整数 �N,第二行一个整数 �i。

保证 0<�<100<N<10;�<�i<N 。

输出格式

一行一个整数,表示满足要求的海滩上最少的鱼数。

输入输出样例

输入 #1

2
1

输出 #1

7

输入 #2

3
1

输出 #2

25

说明/提示

样例解释 2

三只小猫来分鱼 �=3N=3,每次扔掉鱼的数量为 �=1i=1,为了每只小猫都可吃到鱼,可令第三只小猫需要拿走 33 条鱼(拿走 11 条和 22 条不满足要求),则此时待分配的有 1010 条鱼。第二只小猫待分配的鱼有 10×3/2+1=1610×3/2+1=16 条。第一只小猫待分配的鱼有 16×3/2+1=2516×3/2+1=25 条。

AC代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,ans;
bool check(int x)
{
	for(int i=1;i<=n;i++)
	{
		x-=m;
		if(x<=0||x%n)return false;
		x=x/n*(n-1);
	}
	return true;
}
signed main()
{
	scanf("%lld%lld",&n,&m);
	for(ans=(n>8)?380000000:1;;ans++)
	{
		if(check(ans))break;
	}
	printf("%lld",ans);
	return 0;
}

8.[GESP202312 三级] 单位转换

题目描述

小杨这周的数学作业是做单位转换,喜欢编程的小杨决定编程帮他解决这些问题。

小杨只学了长度单位和重量单位,具体来说:

  • 长度单位包括千米(km)、米(m)、毫米(mm),它们之间的关系是:1km=1000m=1000000mm1km=1000m=1000000mm。

  • 重量单位包括千克(kg)、克(g)、毫克(mg),它们之间的关系是:1kg=1000g=1000000mg1kg=1000g=1000000mg。

小杨的作业只涉及将更大的单位转换为更小的单位,也就是说,小杨的作业只会包含如下题型:米转换为毫米,千米转换为毫米,千米转换为米,克转换为毫克,千克转换为毫克,千克转换为克。

现在,请你帮忙完成单位转换的程序。

输入格式

输入的第一行为一个整数,表示题目数量。

接下来 �N 行,每行一个字符串,表示转换单位的题目,格式为 �x 单位 1=?1=? 单位 22。其中,�x 为一个不超过 10001000 的非负整数, 单位 11 和 单位 22 分别为两个单位的英文缩写,保证它们都是长度单位或都是重量单位,且 单位 1 比 单位 2 更大。

例如,如果题目需要你将 1km1km 转换为 mmmm,则输入为 1 km = ? mm

保证 1≤�≤10001≤N≤1000。

输出格式

输出 �N 行,依次输出所有题目的答案,输出时,只需要将输入中的 ?? 代入答案,其余部分一字不差地输出即可。由于小杨的题目只涉及将更大的单位转换为更小的单位,并且输入的 �x 是整数,因此答案一定也是整数。

例如,如果题目需要你将 1km1km 转换为 mmmm,则输入为 1 km = ? mm。则你需要输出 1 km = 1000000 mm

输入输出样例

输入 #1

2
1 km = ? mm
1 m = ? mm

输出 #1

1 km = 1000000 mm
1 m = 1000 mm

输入 #2

5
100 m = ? mm
1000 km = ? m
20 kg = ? g
200 g = ? mg
0 kg = ? mg

输出 #2

100 m = 100000 mm
1000 km = 1000000 m
20 kg = 20000 g
200 g = 200000 mg
0 kg = 0 mg

AC代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int n;
    cin>>n;
	while(n--){
		int a;
		string b,c;
		cin>>a>>b>>c>>c>>c;
		if(b.length()==1||c.length()==1){
			cout<<a<<" "<<b<<" = "<<a*1000<<" "<<c<<endl;
		}else{
			cout<<a<<" "<<b<<" = "<<a*1000000<<" "<<c<<endl;
		}
	} 
	return 0;
}

谢谢大家的关注!!!

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值