【GPLT】天梯赛训练2.3

7-1 谁是赢家

分数 10
作者 陈越
单位 浙江大学

某电视台的娱乐节目有个表演评审环节,每次安排两位艺人表演,他们的胜负由观众投票和 3 名评委投票两部分共同决定。规则为:如果一位艺人的观众票数高,且得到至少 1 名评委的认可,该艺人就胜出;或艺人的观众票数低,但得到全部评委的认可,也可以胜出。节目保证投票的观众人数为奇数,所以不存在平票的情况。本题就请你用程序判断谁是赢家。
输入格式:

输入第一行给出 2 个不超过 1000 的正整数 Pa 和 Pb,分别是艺人 a 和艺人 b 得到的观众票数。题目保证这两个数字不相等。随后第二行给出 3 名评委的投票结果。数字 0 代表投票给 a,数字 1 代表投票给 b,其间以一个空格分隔。
输出格式:

按以下格式输出赢家:

The winner is x: P1 + P2

其中 x 是代表赢家的字母,P1 是赢家得到的观众票数,P2 是赢家得到的评委票数。
输入样例:

327 129
1 0 1

输出样例:

The winner is a: 327 + 1

#include<bits/stdc++.h>
using namespace std;
int main(){
    int pa,pb,ppa=0,ppb=0;
    cin>>pa>>pb;
    int x,y,z,m[3];
    char c;
    cin>>x>>y>>z;
    m[0]=x,m[1]=y,m[2]=z;
    for(int i=0;i<3;i++){
        if(m[i]==0) ppa++;
        else ppb++;
    }
    if(pa>pb&&!(x&&y&&z))
        c='a';
    else if(pa<pb&&(!x&&!y&&!z))
        c='a';
    else{
        c='b';
        pa=pb;
        ppa=ppb;
    }
    printf("The winner is %c: %d + %d",c,pa,ppa);
}

7-2 6翻了

分数 15
作者 陈越
单位 浙江大学

666.JPG

“666”是一种网络用语,大概是表示某人很厉害、我们很佩服的意思。最近又衍生出另一个数字“9”,意思是“6翻了”,实在太厉害的意思。如果你以为这就是厉害的最高境界,那就错啦 —— 目前的最高境界是数字“27”,因为这是 3 个 “9”!

本题就请你编写程序,将那些过时的、只会用一连串“6666……6”表达仰慕的句子,翻译成最新的高级表达。
输入格式:

输入在一行中给出一句话,即一个非空字符串,由不超过 1000 个英文字母、数字和空格组成,以回车结束。
输出格式:

从左到右扫描输入的句子:如果句子中有超过 3 个连续的 6,则将这串连续的 6 替换成 9;但如果有超过 9 个连续的 6,则将这串连续的 6 替换成 27。其他内容不受影响,原样输出。
输入样例:

it is so 666 really 6666 what else can I say 6666666666

输出样例:

it is so 666 really 9 what else can I say 27

//分三种情况就很清晰 也是连续问题 同样用for+while
//因为后面还有i++,so不要忘记i等于j-1
#include<bits/stdc++.h>
using namespace std;
int main() {
	string s;
	getline(cin, s);
	int cnt = 0;
	for (int i = 0; i < s.length(); i++) {
		if (s[i] == '6') {
			int j = i;
			while (s[j] == '6' && j < s.length()) {
				cnt++;
				j++;
			}
			if (cnt > 3 && cnt <= 9) {
				cout << 9;
				i = j - 1;
			}
			else if (cnt > 9) {
				cout << 27;
				i = j - 1;
			}
			else {
				for (i; i < j; i++)
					cout << s[i];
				i = j - 1;
			}
		}
		else
			cout << s[i];
		cnt = 0;
	}
}

7-3 图像过滤

分数 20
作者 陈晓梅
单位 广东外语外贸大学

本题来自于PAT (Basic Level) Practice。

图像过滤是把图像中不重要的像素都染成背景色,使得重要部分被凸显出来。现给定一幅黑白图像,要求你将灰度值位于某指定区间内的所有像素颜色都用一种指定的颜色替换。
输入格式:

输入在第一行给出一幅图像的分辨率,即两个正整数 M 和 N(0<M,N≤500),另外是待过滤的灰度值区间端点 A 和 B(0≤A<B≤255)、以及指定的替换灰度值。随后 M 行,每行给出 N 个像素点的灰度值,其间以空格分隔。所有灰度值都在 [0, 255] 区间内。
输出格式:

输出按要求过滤后的图像。即输出 M 行,每行 N 个像素灰度值,每个灰度值占 3 位(例如黑色要显示为 000),其间以一个空格分隔。行首尾不得有多余空格。
输入样例:

在这里给出一组输入。例如:

3 5 100 150 0
3 189 254 101 119
150 233 151 99 100
88 123 149 0 255

输出样例:

在这里给出相应的输出。例如:

003 189 254 000 000
000 233 151 099 000
088 000 000 000 255

#include<bits/stdc++.h>
using namespace std;
int main(){
    int m,n,a,b,x,y;
    cin>>m>>n>>a>>b>>x;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            cin>>y;
            if(y>=a&&y<=b)
                y=x;
            if(j!=0) cout<<" ";
            printf("%03d",y);
        }
        cout<<endl;
    }
}

7-4 简单计算器

分数 20
作者 张彤彧
单位 浙江大学

模拟简单运算器的工作。假设计算器只能进行加减乘除运算,运算数和结果都是整数,四种运算符的优先级相同,按从左到右的顺序计算。
输入格式:

输入在一行中给出一个四则运算算式,没有空格,且至少有一个操作数。遇等号”=”说明输入结束。
输出格式:

在一行中输出算式的运算结果,或者如果除法分母为0或有非法运算符,则输出错误信息“ERROR”。
输入样例:

1+2*10-10/2=

输出样例:

10

//简单计算器 用几个判断语句即可,注意等号即结束运算
//这里我们用字符输入的方式可能会比字符串更简单
//还有就是注意除数不能为0
#include<bits/stdc++.h>
using namespace std;
int main() {
	char c;
	int a, sum = 0;
	cin >> sum;
	cin >> c;
	while (c != '=') {
		cin >> a;
		if (c == '+')sum += a;
		else if (c == '-')sum -= a;
		else if (c == '*') sum *= a;
		else if (c == '/') {
			if (a == 0) {
				cout << "ERROR";
				return 0;
			}
			else sum /= a;
		}
		else {
			cout << "ERROR";
			return 0;
		}
		cin >> c;
	}
	cout << sum;
}

7-7 猜数字

分数 20
作者 陈越
单位 浙江大学

一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。
输入格式:

输入在第一行给出一个正整数N(≤104)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。
输出格式:

在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。
输入样例:

7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62

输出样例:

22 Amy

//先算出大家的平均数的一半
//然后再设置一个最小值,找出最接近的
#include<bits/stdc++.h>
using namespace std;
struct s {
	string s;//姓名
	int n;//猜的数
};
int main() {
	int n, sum = 0, pos;
	cin >> n;
	s p[10001];
	for (int i = 0; i < n; i++) {
		cin >> p[i].s >> p[i].n;
		sum += p[i].n;
	}
	sum = sum / n / 2;
	cout << sum;
	int min = 999999;
	for (int i = 0; i < n; i++) {
		if (abs(p[i].n - sum) <= min) {
			min = abs(p[i].n - sum);
			pos = i;
		}
	}
	cout << " " << p[pos].s;
}

7-8 N个数求和

分数 20
作者 陈越
单位 浙江大学

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。
输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 …给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。
输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。
输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

//分数求和的分子分母分别等于什么
//求和后的分子分母要约分
//最大公因数函数
//关键在于如何正确输出分数格式
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fenzi = 0, fenmu = 1;

ll gcd(ll a, ll b) {
    if (a % b == 0)
        return b;
    return gcd(b, a % b);
}

void sum(ll x, ll y) {
    ll a = fenzi * y + fenmu * x;
    ll b = fenmu * y;
    ll c = gcd(a, b);
    fenzi = a / c;
    fenmu = b / c;
}

int main() {
    int n;
    cin >> n;
    char c;
    for (int i = 0; i < n; i++) {
        ll x, y;
        cin >> x >> c >> y;
        sum(x, y);
    }
    if (fenzi % fenmu == 0)
        cout << fenzi / fenmu << endl;
    else if (fenzi > fenmu)
        cout << fenzi / fenmu << " " << fenzi % fenmu << "/" << fenmu << endl;
    else
        cout << fenzi << "/" << fenmu << endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值