codeForces #575 div3 传送门
A. Three Piles of Candies
脑残签到,读题太慢;
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int main()
{
int q;
cin>>q;
while(q--)
{
LL a,b,c;
cin>>a>>b>>c;
cout<<(a+b+c)/2<<endl;
}
return 0;
}
B. Odd Sum Segments
利用数字奇偶数字之和的规律,分析出YES的形况——前k-1个区间每个区间分配一个奇数,第k个区间分配奇数个奇数,方能满足每个区间的数字之和为奇数;否则为NO;
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5+7;
int vis[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k,c,cnt=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&c);
if(c%2!=0) vis[cnt++] = i;
}
if(cnt<k) {
printf("NO\n");continue;
}
if((cnt-k+1)%2!=0) {
printf("YES\n");
for(int i=0;i<k-1;i++){
printf("%d ",vis[i]);
}
printf("%d\n",n);
}
else printf("NO\n");
}
return 0;
}
C. Robot Breakout
每个机器人的活动范围取交集,以矩形模拟,输出任一点即可;
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 1e5+7;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
scanf("%d",&n);
int x,y,a,b,c,d;
pair<int ,int> ans[2];
ans[0]={-1e5,-1e5};
ans[1]={1e5,1e5};
for(int i=0;i<n;i++){
scanf("%d%d%d%d%d%d",&x,&y,&a,&b,&c,&d);
int x1=x,y1=y,x2=x,y2=y;
if(a) x1=-1e5;
if(b) y1=1e5;
if(c) x2=1e5;
if(d) y2=-1e5;
ans[0].first = max(x1,ans[0].first );
ans[0].second = max(y2,ans[0].second );
ans[1].first = min(x2,ans[1].first );
ans[1].second = min(y1,ans[1].second );
}
if(ans[0].first <= ans[1].first && ans[0].second <= ans[1].second ){
printf("1 %d %d\n",ans[0].first ,ans[0].second );
}
else printf("0\n");
}
return 0;
}
D1. RGB Substring (easy version)
直接暴力模拟就行了;
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int main()
{
int q;
cin>>q;
char rgb[2020];
for(int i=0;i<=2010;i+=3) {
rgb[i]='R',rgb[i+1]='G',rgb[i+2]='B';
}
while(q--)
{
int n,k;
scanf("%d%d",&n,&k);
char s[2010];
scanf("%s",s);
int ans=0x3f3f3f3f;
for(int i=0;i<=n-k;i++){
int c=0;
while(c<3){
int sum=0;
for(int j=i;j<k+i;j++){
if(s[j]!=rgb[c+j]) sum++;
}
ans=min(ans,sum) , c++;
}
}
printf("%d\n",ans);
}
return 0;
}
D2. RGB Substring (hard version)
也是暴力模拟,但每次比较后使用数组01标记,对此数组的前缀和进行取长度为k的区间的操作,去除了许多重复的操作;
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e5+20;
int a[N];
int main()
{
int q;
cin>>q;
char rgb[N];
for(int i=0;i<=2e5+7;i+=3) {
rgb[i]='R',rgb[i+1]='G',rgb[i+2]='B';
}
while(q--)
{
int n,k,c=0;
scanf("%d%d",&n,&k);
char s[N];
scanf("%s",s);
int ans=0x3f3f3f3f;
while(c<3){
for(int j=0;j<n;j++){
a[j] = 0;
if(s[j]==rgb[c+j]) a[j]=0;
else a[j]=1;
if(j!=0) a[j]=a[j-1]+a[j];
}
c++;
for(int j=k-1;j<n;j++){
if(j==k-1) ans=min(ans,a[j]);
else ans=min(ans,a[j]-a[j-k]);
}
}
printf("%d\n",ans);
}
return 0;
}