题目传送门:CodeForces #575 div3
A
题目很长,意思很简单,给你三个数,求和除以儿就可以了;
B
题意:
给你n个数,把它划分成k个区间(字串),要求每个字串之间不能有重叠部分,并且每个子串的元素和为奇数,如果能划分成k个符合要求的区间,就输出每个区间的右端点的位置;否则输出no
思路;
首先一个字串的元素和要是奇数,那么和其中的偶数元素没有关系,只需要考虑奇数的个数以及位置就可以了;当奇数个数 cot > = k 并且cot%2==k%2时,就可以满足题目要求;记录下每个奇数的位置,然后输出前k-1个奇数的位置,最后输出n(最右边界);
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
int a[1000010];
int b[1000010];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,k;
scanf("%d %d",&n,&k);
int cnt=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]%2==1)
{
b[cnt++]=i;
}
}
if(cnt>=k&&(cnt%2==k%2))
{
printf("YES\n");
for(int i=0;i<k-1;i++)
{
printf("%d ",b[i]);
}
printf("%d\n",n);
}
else printf("NO\n");
}
return 0;
}
C
题意:
给你n个机器人的坐标位置,然后给出每个机器人可以执行的四个操作中的哪一个(上下左右四个方向移动);判断是否能把所有机器人移动到同一个点;如果存在这样的一个点输出出来(可能存在多个,输出任意一个即可)
思路;
维护四个值,最右的x,最左的x,最上的y,最下的y。刚开始定为最大值,构成一个全局矩阵。
根据机器人的坐标和可行方向来缩小能走到的范围,最后判断还能否构造矩阵,能就输出矩阵的任意一个数,否则输出0
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define INF 0x3f3f3f3f
const int maxx = 1e5;
int main() {
int t;
scanf("%d",&t);
while (t--) {
int n;
scanf("%d",&n);
int mnx = -maxx, mxx = maxx;
int mny = -maxx, mxy = maxx;
while (n--) {
int x, y, f1, f2, f3, f4;
scanf("%d %d %d %d %d %d",&x,&y,&f1,&f2,&f3,&f4);
if (!f1) mnx = max(mnx,x);
if (!f2) mxy = min(mxy,y);
if (!f3) mxx = min(mxx,x);
if (!f4) mny = max(mny,y);
}
if (mnx <= mxx && mny <= mxy)
printf("1 %d %d\n",mnx,mny);
else
printf("0\n");
}
return 0;
}
.
D
思路;
因为刚开始策略不对,导致D题过了,E题时间超限,最优的策略就是先构建一个RGB组成的字符串,然后和枚举原字符串,看到长度为k时,需要更换几个字母;注意三个字符的循环放在外面时间复杂度最低;
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
char dis[2000010];
int a[2000010];
int main()
{
int t;
scanf("%d",&t);
for(int i=0;i<200010;i+=3)
{
dis[i]='R',dis[i+1]='G',dis[i+2]='B';
}
while(t--)
{
int n,k;
scanf("%d %d",&n,&k);
string s;
cin >>s;
int minn=INF;
int x=0;
while(x<3)
{
for(int i=0;i<n;i++)//对于三个字符都求出来与原字符串有多少个不同的字符
{
if(s[i]!=dis[i+x]) a[i]=1;
else a[i]=0;
if(i!=0) a[i]=a[i-1]+a[i];
}
x++;
minn=min(minn,a[k-1]);
for(int i=k;i<n;i++)
{
minn=min(minn,a[i]-a[i-k]);
}
}
printf("%d\n",minn);
}
return 0;
}
E
同D题,虽然数据量大了,但是策略还是最优的;