A - Three Piles of Candies
题意:
Alice和Bob前面有三堆糖果,每一堆糖果都有一个固定的数量:第一堆为a,第二堆为b,第三堆为c。两个人分别先拿走较少的两堆糖果,最后再把最后一糖果按照某些神奇的比例进行分配,要做到两个人手中的糖果一样,问Alice最多能拿到多少糖果?
做法:
两个人分配,那最多不就是一半一半吗?三个数字累加除2。注:博主是个傻子,因为某些神奇的原因WA了一发。留个问题为啥下面这两行出现了错误?
//错误代码
scanf("%lld%lld%lld",&a,&b,&c);
printf("%lld\n",(a+b+c)/2);
#include<bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,a[maxn];
signed main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int a,b,c;
cin>>a>>b>>c;
cout<<(a+b+c)/2<<endl;
//printf("%lld\n",(a+b+c)/2);
}
return 0;
}
/**
BRBR 1 2 5 2
B:1 5 ¡Ì
R:2 2
*/
B - Odd Sum Segments
题意:
给定了一个数组,我们需要把这个数组分成k个子数组,然后还得保证每一个子数组的数组和为奇数,如果可以完成操作的话,请输出YES以及你分割的数组的下标位置(分割下标位置为:1 ~a1,a1 ~a2,……,an ~n,注意最后一个n有大用处的!),否则输出NO
做法:
首先明确一点:奇数+奇数=偶数,奇数+偶数=奇数,偶数+偶数=偶数。
因此保证子数组和为奇数的话就得保证数组中存在的奇数的个数为奇数个(说白了其实就是保证有一个就行)所以这里咱就可以进行特判操作了,当整个数组中奇数的个数小于K时可以直接排除了,其次当数组中的奇数的个数与K的奇偶性不一致时,一定会出现两个及以上的奇数会放在一起,这就导致了错误!得注意!所以又一个判断点就是奇数个数与K的奇偶性。这两个点就够了。注:输出的时候要是奇数个数大于K,输出到k-1个时就够了!因为最后一个区间必然是到n的,所以最后一个数字必然是n,别问!问就是WA了,以及再放一段错误代码,是RE的。。。以此为戒!!!相信细心的人必然不会有这种低级错误的!
#include<bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const int maxn=2e5+10;
int n,k,a[maxn];
signed main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
ll odd=0,sum=0;
vector<int> pos;
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]%2!=0)
pos.push_back(i);
}
//cout<<odd<<" "<<k<<endl;
if(pos.size()%2==k%2&&pos.size()>=k)
{
cout<<"YES"<<endl;
for(int i=0;i<k-1;i++)
cout<<pos[i]<<" ";
cout<<n<<endl;
}
else
cout<<"NO"<<endl;
}
return 0;
}
/**
*/
C - Robot Breakout
题意:
一个二维坐标系中给定了n个机器人的坐标,每一个机器人都有四个方向的运动可能,为啥是可能?后面就知道了。输入前两位代表的是坐标,后四位依次是左,上,右,下四个方向(输入1代表能向这个方向移动,0则表示不能移动,移动的距离没有限制!注意这句话!)问在给定所有机器人的坐标以及它们可以运动的方向后,坐标系中是否存在一个点能让所有机器人都到达呢?有则输出1加上坐标,否则输出0。
做法:
注意题意中的红字,移动的距离是没有限制的,变相在说明:只要方向允许机器人可以到达这个区域的任何一个点。所以其实每一个机器人的运动范围是可以求出来的,我们只需要勾画出每一个机器人的范围,然后观察是否相交构成一个区域然后输出这个区域的任何一点即可。(说的有点奇怪,推荐看图然后再自己推一下就能明白了)以及注意最大值这个开到1e5,多一点都不行。。。不用问了嗷,问就是错过QAQ
#include<bits/stdc++.h>
//#define int long long
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const int maxn=1e5+10;
int n,k,a[maxn];
int x[maxn],y[maxn],f[maxn][4];
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
cin>>n;
int minX=-1*(maxn-10),minY=-1*(maxn-10),maxX=maxn-10,maxY=maxn-10;
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i]>>f[i][0]>>f[i][1]>>f[i][3]>>f[i][4];
if(!f[i][0])
minX=max(minX,x[i]);
if(!f[i][1])
maxY=min(maxY,y[i]);
if(!f[i][3])
maxX=min(maxX,x[i]);
if(!f[i][4])
minY=max(minY,y[i]);
}
if(minY<=maxY&&minX<=maxX)
cout<<1<<" "<<minX<<" "<<minY<<endl;
else
cout<<0<<endl;
}
return 0;
}
/**
*/
D - RGB Substring (easy version)
题意:
给定一个长度为n的字符串,里面只包含R,B,G三种字符,问在这个字符串中你是否在原字符串能找到规定字符串中长度为k的子串的个数是多少?规定字符串有三种:RGBRGBRGB……,GBRGBRGBR……,BRGBRGBRG……
做法:
这题我的做法其实有点类似于dp了,但是我感觉又有点想KMP的text数组的感觉,说不准。在遍历原数组的过程中,找到符合条件的字符就在原有的基础上进行+1,否则不变。然后最后再去寻找所有的结果的最小值。
#include<bits/stdc++.h>
//#define int long long
typedef long long ll;
using namespace std;
const int mod=1e9+7;
const int maxn=1e5+10;
int n,k,a[maxn];
int x[maxn],y[maxn],f[maxn][4];
int main()
{
ios::sync_with_stdio(false);
int t;
string Ex="RGB";
cin>>t;
while(t--)
{
string s;
int ch[3][maxn];
cin>>n>>k>>s;
for(int i=0;i<=2;i++)
{
for(int j=0;j<n;j++)
{
if(s[j]!=Ex[(i+j)%3])
ch[i][j+1]=ch[i][j]+1;
else
ch[i][j+1]=ch[i][j];
}
}
int ans=INT_MAX;
for(int i=0;i<=2;i++)
{
for(int j=0;j<=n-k;j++)
ans=min(ans,ch[i][j+k]-ch[i][j]);
}
cout<<ans<<endl;
}
return 0;
}
/**
*/
每日小结
都说居安思危,舒适的环境会使人丧失搏杀的能力。训练的当天B题搞到心态炸裂,过了就开始划水,划到了今天。不得不说划水真快乐!但是咸鱼久了偶尔也得翻一翻不是吗?谁还没有个跃龙门的想法呢是吧!Fighting!