新生题目题解

不闹了,我才是签到

题目描述

通常在ACM竞赛中,分别会有实际参赛队伍数 10 % 10\% 10% 20 % 20\% 20% 30 % 30\% 30% 向下取整的队伍获得金、银、铜牌,其余队伍获得“铁牌”。但是主办方改变了发牌策略,改成了向上取整发出奖牌,现在给出队伍规模,也就是参赛队伍总数,小马同学想知道有多少队伍会从铁牌变成铜牌,从铜牌变成银牌,从银牌变成金牌。

输入格式

输入一行整数 n   ( 10 ≤ n ≤ 10000 ) n\space(10\le n \le 10000) n (10n10000),代表参赛队伍数

输出格式

输出一行,包括三个整数,分别代表奖牌从铁牌变成铜牌,从铜牌变成银牌,从银牌变成金牌的队伍数,每个整数空格隔开。

输入输出样例

输入1

115

输出1

2 1 1

说明/提示

按照原先的规则,会产生 11 11 11 个金牌队伍, 23 23 23个银牌队伍, 34 34 34个铜牌队伍,其他的 47 47 47 个队伍获得 “铁牌”。

思路:
1、算出改变发牌策略后金牌队伍的个数,作差可得银牌变金牌的队伍数
2、算出改变发牌策略后银牌队伍的个数,银变金的队伍加上当前策略下银牌的数量减去旧策略下的银牌队伍数可得铜牌变银牌的队伍数
3、算出改变发牌策略后铜牌队伍的个数,铜变银的队伍加上当前策略下铜牌的数量减去旧策略下的铜牌队伍数可得铁牌变银牌的队伍数

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int inf = 0x3f3f3f3f;

int x;
int main() {
	scanf("%d",&x);
	int res1 = ceil(x*0.1) - int(x*0.1);
	int res2 = res1 + ceil(x*0.2) - int(x*0.2);
	int res3 = res2 + ceil(x*0.3) - int(x*0.3);
	cout<<res3<<" "<<res2<<" "<<res1<<endl;
	return 0;
}

难度评级:中


啥时候才能过马路?

题目描述

总所周知,信号灯有三个颜色:红色 r r r, 黄色 y y y ,绿色 g g g 。而且信号灯每 n n n 秒,就会循环一次,并且假设第 i i i 秒信号灯对应的颜色为 S i S_{i} Si ,你需要等到信号灯变绿才可以过马路,给你当前信号灯的颜色,但是你不知道此颜色的信号灯具体是那一秒的信号灯,所以你要找到一个最小的时间 t t t,来保证你能过马路。我们可假设你可以迅速通过马路,即通过马路不计时间。

输入格式

第一行,包含一个整数 n   ( 1 ≤ n ≤ 2 e 5 ) n\space(1\le n\le 2e5) n (1n2e5) ,和一个字符 c c c (字符 c = [ r , y , g ] c=[r,y,g] c=[r,y,g])​ 代表当前信号灯的颜色。
第二行,输入一个长度为 n n n 的字符串 S S S,其中只包含 r r r y y y g g g 三种字符。其中保证 S S S 一定含有 g g g

输出格式

输出一个整数 t t t 表示能够确保能通过马路的最短时间。

输入输出样例

输入1

5 r
rggry

输出1

3

输入2

1 g
g

输出2

0

输入3

5 y
yrrgy

输出3

4

思路:找到第一个绿灯的位置,将开头到第一个绿灯此段字符串增添到S串末尾,然后我们二分查找当前红绿灯颜色下的最近的绿灯,同时维护所需时间最大值,以保证在任何情况下都可以过马路。
Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
const int INF = 1e6;
int T,n;
char ch;
int main() {
	string s;
	cin >> n >> ch >> s;
	if(ch=='g') {
		puts("0");
		return 0;
	}
	for(int i=0; i<n; i++) {
		s += s[i];
		if(s[i]=='g') break;
	}
	vector<int> q,G;
	int len = s.size(),res = 0;
	for(int i=0; i<len; i++) {
		if(s[i]==ch && i<n) q.push_back(i);
		if(s[i]=='g') G.push_back(i);
	}

	for(auto i:q) {
		int pos = upper_bound(G.begin(),G.end(),i) - G.begin();
		//cout<<G[pos]<<endl;
		res = max(res,G[pos] - i);
	}

	cout<<res<<endl;

	return 0;
}

/*

*/

难度评级:高


比较衬衫大小

题目描述

我们知道衬衫有三种型号, S S S, M M M, L L L,其中 S S S L L L 型号中,可以加上前缀 X X X ,例如 X S XS XS, X X L XXL XXL 等等, S S S 的前缀 X X X 越多,其型号越小, L L L 的前缀 X X X 越多,其型号越大。给你两个字符串 a a a , b b b 代表两个衬衫的尺码,如果一样大输出 “=”, 如果 a a a 尺码大于 b b b 尺码输出 “>”,如果 a a a 尺码小于 b b b 尺码输出"<"。

输入格式

一行两个字符串 a a a, b b b, 其字符串长度不超过 50 50 50

输出格式

输出一个字符,代表 a a a, b b b 衬衫大小比较的结果。

输入输出样例

输入1

XXXS XS

输出1

<

输入2

XXXL XL

输出2

>

输入3

L M

输出3

>

思路:先拿出字符串最后一位判断是哪一种型号,然后再根据X的个数判断大小即可:
Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int inf = 0x3f3f3f3f;


int T;
map<char,int> mp;
int main() {
	mp['S'] = 1;
	mp['M'] = 2;
	mp['L'] = 3;
	string a,b;
	cin >> a >> b;
	if(a==b) {
		puts("=");
		return 0;
	}
	int la = a.size();
	int lb = b.size();

	if(mp[a[la-1]] != mp[b[lb-1]]) {
		mp[a[la-1]] > mp[b[lb-1]] ? puts(">") : puts("<");
	} else {
		if(a[la-1] == 'S') a.size() > b.size() ? puts("<") :puts(">");
		if(a[la-1] == 'L') a.size() > b.size() ? puts(">") :puts("<");
	}

	return 0;
}

/*


*/

难度评级:易


题目描述

给你三个数字,请你确定是否有一个数字等于其他两个数字的和

输入格式

输入一行三个数字 a a a, b b b, c c c ( 0 ≤ a , b , c ≤ 20 ) (0 \le a,b,c\le20 ) (0a,b,c20)

输出格式

输出一行,如果有一个数字为其他两个数字的和,那么输出 “YES”, 否则输出 “NO”。

输入输出样例

输入1

1 4 3

输出1

YES

思路:三个数字两两组合,与第三个数字进行判断即可

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int inf = 0x3f3f3f3f;


int a,b,c;
int main() {
	cin >> a >> b >> c;
	if(a==(b+c) || b==(a+c) || c==(a+b)) printf("YES");
	else printf("NO");
	return 0;
}

/*


*/

难度评级:易


我是一个快乐的油漆工

题目描述

在一个 8 × 8 8\times8 8×8 的方格上,有一个油漆工只会水平着刷红色的油漆,垂直着刷蓝色的油漆,并且一刷就刷一整行或者一整列。

假设油漆工先垂直刷一道蓝色,在水平刷一道红色,就是如图所示流程。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5JlBJfN6-1666615461082)(./Images/图片1.png)]

每次刷漆有可能会覆盖掉之前的颜色,在执行多次涂刷任务后,请问油漆工最后一次是刷的什么颜色。

输入格式

输入共 八行,每行八个字符。每个字符是 “R”, “B”, 或 “.” 其中之一。
保证数据一定有解。

输出格式

输出一个字符,若最后涂刷的颜色为红色则输出 “R”,若为蓝色则输出 “B”。

输入输出样例

输入1

....B...
....B...
....B...
RRRRRRRR
....B...
....B...
....B...
....B...

输出1

R

输入2

RRRRRRRB
B......B
B......B
B......B
B......B
B......B
B......B
RRRRRRRB

输出2

B

思路:因为每一次涂抹都会覆盖掉上次所涂抹的颜色,所以横向判断有没有完整的R,纵向判断有没又完整的B,即可判断出最终结果
Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int inf = 0x3f3f3f3f;
int T;
char ch[10][10];
int main() {
	for(int i=1; i<=8; i++)
		for(int j=1; j<=8; j++)
			cin >> ch[i][j];
	bool ok = 1;
	for(int i=1; i<=8; i++) {
		ok = 1;
		for(int j=1; j<=8; j++) {
			if(ch[i][j]!='R') {
				ok = 0;
				break;
			}
		}
		if(ok) {
			puts("R");
			break;
		}
	}
	if(!ok) puts("B");

	return 0;
}

/*


*/

难度评级:中


可以严格递增吗?

题目描述

我们获得了一个序列 x x x,该序列包含 n n n 个元素。我们需要判断是否存在该序列的一种排列方式可以使得该序列严格递增。

如果该序列 x 1 < x 2 < . . . < x n x_{1}<x_{2}<...<x_{n} x1<x2<...<xn 则称该序列为严格递增序列。

输入格式

第一行一个整数 n   ( 1 ≤ n ≤ 100 ) n\space(1\le n\le 100) n (1n100)
第二行 n n n 个整数 a i   ( 1 ≤ a i ≤ 1 e 9 ) a_{i}\space(1\le a_{i}\le 1e9) ai (1ai1e9)

输出格式

输出一行,如果可以找到一种排列方式使得该序列成为严格递增序列,输出 “YES”,否则输出 “NO”。

输入输出样例

输入1

4
1 1 1 1

输出1

NO

输入2

5
8 7 1 3 4

输出2

YES

思路:如果没有重复元素即可构成严格递增序列,所以可以通过set容器判断元素个数来判断有无重复元素

Code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
const int inf = 0x3f3f3f3f;
int T;
set<int> st;
int main() {
	int n;
	cin >> n;
	
	for(int i=0; i<n; i++) {
		int x;
		cin >> x;
		st.insert(x);
	}
	if(st.size() == n) puts("YES");
	else puts("NO");

	return 0;
}

/*


*/

难度评级:易

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值