A. Two 0-1 Sequences
题目链接:
Problem - A - Codeforces
题面:
?
题意:
有一个01串a,b,我们可以对a进行两个操作
1.使a2变成min(a1,a2),删除a1
2.使a2变成max(a1,a2),删除a2
问最后能否使a变成b
思路:
如果a串的长度大于b串,就看a1是否等于b1,如果相同就把a2变成a1,删除a1,知道两串长度相同,然后判断是否相同
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int n, m;
cin >> n >> m;
string s, ss;
cin >> s >> ss;
while(n > m){
if(s[0] == ss[0]){
s[1] = s[0];
}
s.erase(0, 1);
n--;
}
if(s == ss){
cout << "YES" << endl;
}else{
cout << "NO" << endl;
}
}
return 0;
}
B. Luke is a Foodie
题目链接:
Problem - B - Codeforces
题面:
题意:
思路:
由|v-ai|x可得:vx + ai 以及 vai - x,以此我们可以通过如果前一个算出来的范围大于后一个,那么我们缩小范围即可,如果后一个的范围不在第一个里面,那么我们就要更改一次
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[200005];
int main(){
int t;
cin >> t;
while(t--){
int n, x;
cin >> n >> x;
for(int i = 0; i < n; i++){
cin >> arr[i];
}
int maxn = x + arr[0];
int minn = arr[0] - x;
int ans = 0;
for(int i = 1; i < n; i++){
int a = x + arr[i];
int b = arr[i] - x;
if(b > maxn || a < minn){
ans++;
maxn = a;
minn = b;
}
if(b >= minn){
minn = b;
}
if(a <= maxn){
maxn = a;
}
}
cout << ans << endl;
}
return 0;
}
C. Virus
题目链接:
Problem - C - Codeforces
题面:
题意:
思路:
一开始有m个房子被感染,那么就会有m个区间,我们优先选择房子多的区间进行保护,保护一个房子数大于等于3的区间需要两天,大于等于1的需要1天,由此我们可以算出我们最多可以保护的房子数,最后输出总数-保护数即可
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[100005];
bool cmp(int a, int b){
return a > b;
}
int main(){
int t;
cin >> t;
while(t--){
int n, m;
cin >> n >> m;
for(int i = 1; i <= m; i++){
cin >> arr[i];
}
if(m == 1){
cout << 2 << endl;
continue;
}
sort(arr + 1, arr + 1 + m);
vector<int> ve;
ve.push_back(arr[1] - 1 + n - arr[m]);
for(int i = 2; i <= m; i++){
ve.push_back(arr[i] - arr[i - 1] - 1);
}
sort(ve.begin(), ve.end(), cmp);
int a = 0;//其他区间以及感染的房子数
int ans = 0;
for(int i = 0; i < ve.size(); i++){
if(ve[i] - a >= 3){
ans += ve[i] - a - 1;
a += 4;
}else if(ve[i] - a >= 1){
ans ++;
a += 2;
}
}
cout << n - ans << endl;
}
return 0;
}
|