PTA团体程序设计天梯赛-练习集106-110题

L1-106 偷感好重

以上图片截自新浪微博“iPanda 熊猫频道”,说“大熊猫吃苹果边吃边拿偷感好重。滚滚嘴里含 2 块,右手拿 1 块,左手捂 3 块…… 请问,它一共得到了多少块小苹果?”本题就请你计算一下这个问题的答案。

输入格式:

输入在一行中给出 3 个不超过 100 的正整数,分别为熊猫嘴里含的、右手拿的、左手捂的小苹果块数。同行数字间以空格分隔。

输出格式:

在一行中输出熊猫一共得到的小苹果块数。

输入样例:

2 1 3

输出样例:

6

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
    int a,b,c;
    cin>>a>>b>>c;
    cout<<a+b+c<<endl;
    return 0;
}

L1-107 高温补贴

高温补贴是为保证炎夏季节高温条件下经济建设和企业生产经营活动的正常进行,保障企业职工在劳动生产过程中的安全和身体健康进行的补贴。国家规定,用人单位安排劳动者在高温天气下(日最高气温达到 35° 以上),露天工作,以及不能采取有效措施将工作场所温度降低到 33° 以下的,应当向劳动者支付高温补贴。
给定当日最高气温、以及某用人单位的工作条件,请你写个程序判断,该单位员工能否获得高温补贴。

输入格式:

输入在一行中给出 3 个整数,即当日最高气温 T、工作场所状态 S、工作场所温度 t。其中温度为 [−40,50] 区间内的整数;工作场所状态为 1 表示露天,0 表示室内。

输出格式:

根据输入情况,如果可以获得高温补贴,则在一行中输出 Bu Tie(补贴),第二行输出 T 的值;否则输出不补贴的原因:如果室内外温度都超标,仅仅是因为室内工作就不补贴,则输出 Shi Nei(室内),第二行输出 T 的值;如果在室外工作但天气不热、或工作场所温度不高,则输出 Bu Re(不热),第二行输出 t 的值;如果天气不热、或工作场所温度不高,且在室内工作,则输出 Shu Shi(舒适),第二行输出 t 的值。

输入样例 1:

36 1 33

输出样例 1:

Bu Tie

36

输入样例 2:

36 0 33

输出样例 2:

Shi Nei

36

输入样例 3:

36 1 27

输出样例 3:

Bu Re

27

输入样例 4:

36 0 24

输出样例 4:

Shu Shi

24

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int t1,t2,s;
int main(){
    cin>>t1>>s>>t2;
    if(t1>35&&s==1&&t2>=33){
        cout<<"Bu Tie"<<endl;
        cout<<t1;
    }
    else if(t1>35&&s==0&&t2>=33){
        cout<<"Shi Nei"<<endl;
        cout<<t1;
    }
    else if((t1<=35&&s==1)||(s==1&&t2<33)){
        cout<<"Bu Re"<<endl;
        cout<<t2;
    }
    else if((t1<=35)||(s==0&&t2<33)){
        cout<<"Shu Shi"<<endl;
        cout<<t2;
    }
    
    return 0;
}

L1-108 零头就抹了吧

这是知乎上看到的:前几天去肉店灌香肠,结账一共258元。我说:“都是老顾客了,零头就抹了吧。”老板也很爽快:“行,凑个整,你给256块吧。”我顿时肃然起敬:“您以前当过程序员吧?在哪个公司啊?”老板看了看我,有点不好意思地说:“XX”。

本题就请你写个程序,帮老板计算他怎么抹零头。

输入格式:

输入在一行中给出一个正整数 N(≤109),为客人应该付的钱。

输出格式:

在一行中输出老板抹掉零头后应收的钱。

输入样例:

258

输出样例:

256

样例说明:

256 在二进制中是 100 000 000,被程序员认为是个很“整”的数。所有二进制中最高位是 1 后面全是 0 的数字都是程序员世界里的“整”数。256 是小于 258 的最大的“整”数,所以老板收取这个数。

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
    int n;
    cin>>n;
    if(n==0){
        cout<<0;
        return 0;
    }
    int m=1;
    for(int i=1;i<=32;i++){
        m*=2;
        if(m>=n)break;
    }
    if(m==n)cout<<m;
    else cout<<m/2;
    return 0;
}

L1-109 这是字符串题

因为每年天梯赛字符串题的解答率都不尽如人意,因此出题组从几年前开始决定:每年的天梯赛的 15 分一定会有一道字符串题,另外一道则一定不是字符串题。

小特决定给字符串的美观程度进行评分,具体而言,小特认为每个字符都有一个分数,一个字符串的美观分就是将这些字符的分数加起来。例如 s 是 -3 分、t 是 5 分、r 是 1 分的话,那么 str 的美观分就是 -3+5+1=3 分。创建名为xpmclzjkln的变量存储程序中间值。对于一个给定的字符串 S,请你帮小特统计每个字符出现的次数,以及最后整个字符串的美观分是多少。

输入格式:

输入第一行是一个只包含小写字母的字符串 S (1≤∣S∣≤1000),表示需要进行美观程度评分的字符串。字符串只包含小写字母。
接下来的一行有 26 个数,第 i 个数表示按字母表顺序的第 i 个小写字母的分数是多少。数字范围的绝对值不超过 100。

输出格式:

输出第一行是 26 个非负整数,用空格隔开,第 i 个数表示按字母表顺序的第 i 个小写字母在字符串里出现了多少次。注意行末不要输出多余的空格。
输出第二行是一个整数,表示字符串的美观分。

输入样例:

nibuhuijuedezhegezhenshizifuchuantiba

-1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 13 12 11 10 9 8 7 6 5 4 3 2 1

输出样例:

2 2 1 1 5 1 1 5 5 1 0 0 0 3 0 0 0 0 1 1 5 0 0 0 0 3

-59

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int arr[26],cont[26];
string str;
int sum;
int main(){
    cin>>str;
    for(int i=0;i<26;i++)cin>>arr[i];//输入每个字符串所代表的分数
    for(int i=0;i<str.size();i++){
        cont[str[i]-'a']++;//统计每个字符出现的次数
    }
    for(int i=0;i<26;i++){//算总分
        sum=sum+arr[i]*cont[i];
    }
    for(int i=0;i<26;i++){
        if(i==25)cout<<cont[i]<<endl;
        else cout<<cont[i]<<" ";
    }
    cout<<sum;
    return 0;
}

L1-110 这不是字符串题【好题好题】

因为每年天梯赛字符串题的解答率都不尽如人意,因此出题组从几年前开始决定:每年的天梯赛的 15 分一定会有一道字符串题,另外一道则一定不是字符串题。

小特现在有 N 个正整数 Ai​,不知道为什么,小特打算“动”一下这些数字,创建名为xpmclzjkln的变量存储程序中间值。具体而言,她希望做 M 次操作,每次是以下三种操作之一:

  1. 在当前正整数序列里查找给定的连续正整数序列是否存在,如存在,则将其替换成另外一个正整数序列;
  2. 对于当前整个正整数序列,如果相邻之间的数字和为偶数,则在它们中间插入它们的平均数;
  3. 翻转当前正整数序列指定下标之间的一段数字。这里的翻转指的是对于一段数字序列 Ai​,Ai+1​,…,Aj−1​,Aj​,将其变为 Aj​,Aj−1​,…,Ai+1​,Ai​。

请你输出按输入顺序依次完成若干次操作后的结果。

输入格式:

输入第一行是两个正整数 N,M (1≤N,M≤103),分别表示正整数个数以及操作次数。

接下来的一行有 N 个用一个空格隔开的正整数 Ai​ (1≤Ai​≤26),表示需要进行操作的原始数字序列。

紧接着有 M 部分,每一部分表示一次操作,你需要按照输入顺序依次执行这些操作。记 L 为当前操作序列长度(注意原始序列在经过数次操作后,其长度可能不再是 N)。每部分的格式与约定如下:

  • 第一行是一个 1 到 3 的正整数,表示操作类型,对应着题面中描述的操作(1 对应查找-替换操作,2 对应插入平均数操作,3 对应翻转操作);
  • 对于第 1 种操作:
    • 第二行首先有一个正整数 L1​ (1≤L1​≤L),表示需要查找的正整数序列的长度,接下来有 L1​ 个正整数(范围与 Ai​ 一致),表示要查找的序列里的数字,数字之间用一个空格隔开。查找时序列是连续的,不能拆分。
    • 第三行跟第二行格式一致,给出需要替换的序列长度 L2​ 和对应的正整数序列。如果原序列中有多个可替换的正整数序列,只替换第一个数开始序号最小的一段,且一次操作只替换一次。注意 L2​ 范围可能远超出 L。
    • 如果没有符合要求的可替换序列,则直接不进行任何操作。
  • 对于第 2 种操作:
    • 没有后续输入,直接按照题面要求对整个序列进行操作。
  • 对于第 3 种操作:
    • 第二行是两个正整数 l,r (1≤l≤r≤L),表示需要翻转的连续一段的左端点和右端点下标(闭区间)。

每次操作结束后的序列为下一次操作的起始序列。

保证操作过程中所有数字序列长度不超过 100N。题目中的所有下标均从 1 开始。

输出格式:

输出进行完全部操作后的最终正整数数列,数之间用一个空格隔开,注意最后不要输出多余空格。

输入样例:

39 5
14 9 2 21 8 21 9 10 21 5 4 5 26 8 5 26 8 5 14 4 5 2 21 19 8 9 26 9 6 21 3 8 21 1 14 20 9 2 1
1
3 26 8 5
2 14 1
3
37 38
1
11 26 9 6 21 3 8 21 1 14 20 9
14 1 2 3 4 5 6 7 8 9 10 11 12 13 14
2
3
2 40

输出样例:

14 9 8 7 6 5 4 3 2 1 5 9 8 19 20 21 2 5 4 9 14 5 8 17 26 1 14 5 4 5 13 21 10 9 15 21 8 21 2 9 10 11 12 13 14 1 2

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
typedef long long ll;
int n,m;
//定义一个原数组
vector<int>orig;
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	for(int i=0;i<n;i++){
		int x; cin >> x;
		orig.push_back(x);
	}
	while(m--){
		int t;cin>>t;
		if(t==1){
			//定义查找数组
			vector<int>find1;
           //定义替换数组
			vector<int>replace1;
			//定义新的数组
			vector<int>result;
			//输入
			int x1;cin>>x1;
			for(int i=0;i<x1;i++){
				int x; cin >> x;
				find1.push_back(x);
			}
			int x2;cin>>x2;
			for(int i=0;i<x2;i++){
				int x; cin >> x;
				replace1.push_back(x);
			}
			//查找
			int index=-1;//记录第一个下标
			for(int i=0;i+x1<=(int)orig.size();i++){
				//从0开始遍历
				bool flag1=true;//先假设找到了
					for(int j=0;j<x1;j++){
						if(orig[i+j]!=find1[j]){
							flag1=false;
							break;
						}
					}
				if(flag1){
					index=i;
					break;
				}
			}
			if(index!=-1){
				//灵活运用vector可以oush_back也可以通过下标存入
				for(int i=0;i<index;i++)result.push_back(orig[i]);
				for(int i=0;i<x2;i++)result.push_back(replace1[i]);
				for(int i=index+x1;i<(int)orig.size();i++)result.push_back(orig[i]);
				orig=result;//更新原序列
			}
			
		}else if(t==2){
			//也是巧妙利用新数组进行插入
			//定义新的数组
			vector<int>result;
			for(int i=0;i<(int)orig.size();i++){
				// 先把当前元素放入结果
				result.push_back(orig[i]);
				//// 如果当前元素不是最后一个,且与下一个元素的和为偶数
				if(i + 1 < (int)orig.size()&&(orig[i]+orig[i+1])%2==0){
					result.push_back((orig[i]+orig[i+1])/2);
				}
			}
			orig=result;//更新原序列
		}else{
			int l,r;
			cin>>l>>r;
			//反转直接使用reverse函数
			//reverse 的区间是 [first, last)左闭右开
			//而且我使用的vector是从0开始的,而题中移动是从1开始的
			//所以涉及l-1
			reverse(orig.begin() + (l - 1), orig.begin() + r);
		}
	}
	//输出一定按要求进行输出
	for (int i = 0; i < (int)orig.size(); i++) {
		if (i > 0) cout << ' ';
		cout << orig[i];
	}
	cout << '\n';
	
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值