A. Mark the Photographer
题目链接:
题面:
题意:
有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
题目链接:
题面:
题意:
可以选择一个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
题目链接:
题面:
题意:
给定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;
}