Codeforces Round #807 (Div. 2)(A.B.C)

A. Mark the Photographer

题目链接:

Problem - A - Codeforces

题面: 

 

题意: 

有2n个人想拍照,要求排两排,每个人都要入镜头,如果后排的比前排的高x就不会挡住

思路:

排序一下,0对应n, 1对应n+1,2对应n+2,以此类推,看看后面的是否比前面的大x

代码:

#include<bits/stdc++.h>
using namespace std;
int arr[105];

int main(){
	int n;
	int t;
	cin >> t;
	int x;
	while(t--){
		cin >> n >> x;
		for(int i = 0; i < 2 * n; i++){
			cin >> arr[i];
		}
		sort(arr, arr + 2 * n);
		bool f = 0;
		for(int i = 0; i < n; i++){
			if(arr[i + n] - arr[i] < x){
				f = 1;
				break;
			}
		}
		if(f){
			cout << "NO" << endl;
		}else{
			cout << "YES" << endl;
		}
	}
	return 0;
}

B. Mark the Dust Sweeper

题目链接:

Problem - B - Codeforces

题面:

 

题意: 

可以选择一个i,j(从i到j-1的所有数都大于0)使ai-1,aj+1,问把a0到an-1的所有数变成0需要几步

思路:

如果一段区间都是非0的,那么需要的次数就使区间,如果有0并且前面有数,那就需要多一步把这个0变成1

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll arr[200005];

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin >> t;
	while(t--){
		int n;
		cin >> n;
		for(int i = 0; i < n; i++){
			cin >> arr[i];
		}
		ll a = 0;
		ll ans = 0;
		for(int i = 0; i < n - 1; i++){
			if(arr[i] == 0 && a != 0){
				ans++;
			}
			a += arr[i];
		}
		ans += a;
		cout << ans << endl;
	}
	return 0;
}

C. Mark and His Unfinished Essay

题目链接:

Problem - C - Codeforces

题面:

 

题意:

给定n,c,q表示字符串的长度,操作的次数,查询的次数。然后给定一个字符串,每次操作输入l,r。从字符串中截取(l - 1,r - 1)添加到后面,然后查询字符串中的k个字符

思路:

通过查询的位置,不断往前推,直到 <= n的时候就知道是哪个字母了

我们可以在每次输入的时候求出长度,然后通过二分的查询在第几段,然后通过找输入的l的位置不断往前面推即可

#include<bits/stdc++.h>
using namespace std;

long long arr[105];
long long sum[105];
long long l[45];
long long r[45];

int main(){
	int t;
	cin >> t;
	while(t--){
		int n, m, k;
		cin >> n >> m >> k;
		string s;
		cin >> s;
		arr[0] = sum[0] = n;
		l[0] = 1;
		for(int i = 1; i <= m; i++){
			cin >> l[i] >> r[i];
			arr[i] = r[i] - l[i] + 1;
			sum[i] = sum[i - 1] + arr[i];
		}
		while(k--){
			long long  a;
			cin >> a;
			while(a > n){
				int ans = lower_bound(sum, sum + m + 1, a) - sum;
				a = l[ans] + a - sum[ans - 1] - 1;
				
			}
			cout << s[a - 1] << endl;
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值