CodeForces #575 div3

题目传送门: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题,虽然数据量大了,但是策略还是最优的;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值