Codeforces Round #575 (Div. 3)
A. Three Piles of Candies
一定数量n糖,a和b两个人分,且a和b分到的糖的数目应该相等。
直接 n/2 输出
#include <iostream> #include <algorithm> using namespace std; int main() { int t; scanf("%d",&t); while(t--) { long long a,b,c; scanf("%lld%lld%lld",&a,&b,&c); printf("%lld\n",(a+b+c)/2); } }
B. Odd Sum Segments
题意:给一个含n个数的数组 一个k 要求问能否将数组分成k段 且使每一段和和都为奇数。
分析:奇数加偶数等于奇数,所以我们只需要统计奇数的个数并记录奇数的位置使得每一段区间都有奇数个奇数和任意个偶数。
当奇数数量 s==k时 一个区间恰好有一个奇数。当奇数数量s>k 且 (s-k)%2==0时 代表多出来偶数个奇数 偶数个奇数相加还是偶数
这样我们就可以 把前k-1奇数分别放到前k-1个区间内 并将剩下的奇数放到一个区间 这样每个区间的元素和都是奇数
#include <iostream> #include <algorithm> const int N =2e5+10; int a[N],count[N]; int t,n,k; int main() { scanf("%d",&t); while(t--) { int top=0; long long sum=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]%2!=0) count[++top]=i; } if(top>=k&&(top-k)%2==0) { printf("YES\n"); for(int i=1;i<k;i++) printf("%d ",count[i]); printf("%d",n); printf("\n"); } else printf("NO\n"); } }
#include <iostream> #include <algorithm> using namespace std; const int N=1e5+10,INF=1e5; int t; int main() { scanf("%d",&t); while(t--) { int mxy=INF,mnx=-INF,mny=-INF,mxx=INF; int n; scanf("%d",&n); for(int i=1;i<=n;i++) { int x,y,c,d,e,f; scanf("%d%d%d%d%d%d",&x,&y,&c,&d,&e,&f); if(!c) mnx=max(mnx,x); if(!d) mxy=min(mxy,y); if(!e) mxx=min(x,mxx); if(!f) mny=max(y,mny); } if(mxx>=mnx&&mxy>=mny) printf("1 %d %d\n",mnx,mny); else printf("0\n"); } }
C. Robot Breakout
题意:给定n个机器人 他们共有四个移动方向,每个机器人的移动方向数量不相等。给你n个机器人,并给出该机器人可以移动的方向,问所有机器人能否走到一个点上。
分析:我们先设四个方向的边界,枚举每个机器人,通过它可以移动的方向来更新我们的边界,最后判断四个边界能否构成矩形。