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;
}