A - Three Piles of Candies
题意:就是给了三堆糖,两个人,每人哪一堆,然后第三堆用来补充,最终要达到两个人的糖的数量一样多。
思路:水题,签到

#include<bits/stdc++.h>
typedef unsigned long long LL;

using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		LL a,b,c;
		cin>>a>>b>>c;
		cout<<(a+b+c)/2<<endl;
	}
	return 0;
}

B - Odd Sum Segments Odd Sum Segments
题意:意思就是给你几个数,然后分成几段,能否每段数字和都为奇数。
思路:这里可以推导一下,需要用到数论的一些内容。
即:flag % 2 == k%2 如果奇数的数量对2取余等于要分成的段数的对2取余的话,那么存在这样的分法。
然后对其遍历对奇数输出即为所求段落的区间。

#include<iostream>
#include<algorithm>
#define maxn 200050
using namespace std;
typedef long long ll;

ll a[maxn];
ll t,n,k,flag;

int main(){
     int t;
     cin>>t;
     while(t--){
      flag = 0;
      cin>>n>>k;
      for(int i=1;i<=n;i++){
          cin>>a[i];
          if(a[i]&1) flag++;
        }
      if(flag % 2 == k%2 && flag>=k){
        cout<<"YES"<<endl;
        k--;
        for(int i=1;i<=n,k>0;i++){
           if(a[i]&1){  cout<<i<<" ";k--;}
          }
         cout<<n<<endl;
      }
      else{ cout<<"NO"<<endl;}
    }
    return 0;
}

Robot Breakout Robot Breakout
题意:意思就是有机器人若***对每一个个体能进行的控制有限,(上,下,左,右)可能只能进行其中的若干,问是否存在指令让所有的机器人都能走到同一位置,你好实行抓捕活动。

思路:我们应该从机器人不能朝哪个方形行走入手然后。可以这样来想,一开始的话整个界面是无限的,然后我们对其进行缩小,然后缩小的区域是所有机器人都能到达的,然后我们输出这样的坐标就行了。

#include<bits/stdc++.h>
#define maxn 100000
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
 
int main() {
    int q;
    cin >> q;
    while (q--) {
        int n;
        cin >> n;
        int zuo = -maxn;
		int shang = maxn;
        int xia = -maxn;
		int  you = maxn;
        while (n--) {
            int x, y, f1, f2, f3, f4;
            cin >> x >> y >> f1 >> f2 >> f3 >> f4;
            if (!f1) zuo = max(zuo, x);
            if (!f2) shang = min(shang, y);
            if (!f3) you = min(you, x);
            if (!f4) xia = max(xia, y);
        }
        if (zuo <= you && xia <= shang)
            cout << "1 " << zuo << " " << xia << endl;
        else
            cout << "0" << endl;
    }
 
    return 0;
}

RGB Substring (easy version) easy version
题意:比较容易理解;

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f

using namespace std;

const int m = 2e3+10;

char s[m];
int a[3][m];

int main(){ 
    int T;
	cin>>T;
	
	string t = "RGB";
	
	while(T--){
		a[0][0] =a[1][0] = a[2][0] = 0;
		int n,k; 
		cin>>n>>k; 
		cin>>s;	
				
		for(int i=0;i<n;i++)
		  for(int j=0;j<=2;j++){
		  	if(s[i] != t[(i+j)%3])
		  	  a[j][i+1] = a[j][i] + 1;//不相等的话,让其改变加1; 
		  	else
		  	  a[j][i+1] = a[j][i];//相等的话就不用改变,与上一个字符所需的改变次数一致; 
		  }
		  int ans = inf;
		  for(int i=0;i+k<=n;i++){
		  	for(int j=0;j<=2;j++){
		  		ans = min(ans,a[j][i+k]-a[j][i]);
			  }
		  }
		  cout<<ans<<endl;
	}
	return 0;
}

RGB Substring (hard version) hard version
思路:好像是数据范围变大了,但是我借助上一题只改了一下数据范围就AC了。emmmmm

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f

using namespace std;

const int m = 2e5+10;

char s[m];
int a[3][m];

int main(){ 
    int T;
	cin>>T;
	
	string t = "RGB";
	
	while(T--){
		a[0][0] =a[1][0] = a[2][0] = 0;
		int n,k; 
		cin>>n>>k; 
		cin>>s;	
				
		for(int i=0;i<n;i++)
		  for(int j=0;j<=2;j++){
		  	if(s[i] != t[(i+j)%3])
		  	  a[j][i+1] = a[j][i] + 1;//不相等的话,让其改变加1; 
		  	else
		  	  a[j][i+1] = a[j][i];//相等的话就不用改变,与上一个字符所需的改变次数一致; 
		  }
		  int ans = inf;
		  for(int i=0;i+k<=n;i++){
		  	for(int j=0;j<=2;j++){
		  		ans = min(ans,a[j][i+k]-a[j][i]);
			  }
		  }
		  cout<<ans<<endl;
	}
	return 0;
}

Connected Component on a Chessboard 没太懂
思路:这个题我参考了网上的代码,但不是特别理解,看不懂,头晕,此坑先留着,有空再填。

#include<bits/stdc++.h>

using namespace std;


const int dr[]= {0, 0, -1, 1, -1, -1, 1, 1};
const int dc[]= {-1, 1, 0, 0, -1, 1, -1, 1};
inline int read()//输入外挂
{
    int ret=0, flag=0;
    char ch;
    if((ch=getchar())=='-')
        flag=1;
    else if(ch>='0'&&ch<='9')
        ret = ch - '0';
    while((ch=getchar())>='0'&&ch<='9')
        ret=ret*10+(ch-'0');
    return flag ? -ret : ret;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int w,b;
        scanf("%d%d",&b,&w);//b黑色 w白色
        if(max(w,b)>min(w,b)*3+1)
        {
            printf("NO\n");
            continue;
        }
        if(w==b)
        {
            printf("YES\n");
            for(int i=3; i<=w+b+2; ++i)
                printf("5 %d\n",i);
        }
        else if(b<w)
        {
            printf("YES\n");
            w=w-b-1;//将在一行的减掉
            for(int i=4; i<=b*2+4; i++)
            {
                printf("4 %d\n",i);
                if(w>0 && i&1)
                {
                    printf("3 %d\n",i);
                    w--;
                }
                if(w>0  && i&1 )
                {
                    printf("5 %d\n",i);
                    w--;
                }
            }
        }
        else if(b>w)
        {
            swap(b,w);
            printf("YES\n");
            w=w-b-1;//将在一行的减掉
            for(int i=4; i<=b*2+4; i++)
            {
                printf("3 %d\n",i);
                if(w>0 && i&1)
                {
                    printf("2 %d\n",i);
                    w--;
                }
                if(w>0  && i&1 )
                {
                    printf("4 %d\n",i);
                    w--;
                }
            }
        }
    }
    return 0;
}