Codeforces Round #630 (Div. 2)ABCD

Codeforces Round #630 (Div. 2) 题目链接

文章目录

A.

题意:需要向左走a步,向右走b步,向下走c步,向上走d步,同个格子可以走重复过,并且给出启示位置(x,y),需要保证x1<=x<x2,y1<=y<=y2

我看了别人的题解,A题大串的代码实在看不下去,就写了这份简单短点的。
题解:考虑到同个格子可以走重复过,所以就是可以来回走,只想算出最终x的值变换-a+b,y的值变化-c+d
重点:还需要加上特判边界刚好是x=x1=x2或y=y1=y2的情况,因为此时点动弹不得,一动就越界了
如下是AC代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
	 ll a,b,c,d;
	 cin>>a>>b>>c>>d;
	 ll x,y,x1,y1,x2,y2;
	 cin>>x>>y>>x1>>y1>>x2>>y2;
	 if((x==x1&&x==x2&&a>0||x==x1&&x==x2&&b>0)||(y==y1&&y==y2&&c>0||y==y1&&y==y2&&d>0))
	 {
	 	cout<<"No"<<'\n';continue;
	 }
	   x=x-a+b;y=y-c+d;		
	if(x>=x1&&x<=x2&&y>=y1&&y<=y2)cout<<"Yes"<<'\n';
	else cout<<"No"<<'\n';	
	}	
}

B.

题意:n个数需要染色,而且这n个数中,如果存在gcd(a[i],a[j])!=1,每组的每两个数都不是互素的,则可以染成不同种颜色,即分组,求需要用多少种染色剂和输出每个数染色剂的组号

直接不用考虑合数,可以重题目上看到m<=11,a[i]<=1000,数据小,小于1000的最后一个平方是31*31=961,所以可以考虑前m个质数,即可用一个数组int p[12]={0,2,3,5,7,11,13,17,19,23,29,31},把最小的质因数相同的数字分到同一组染色剂即可

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second 
#define ll long long 
#define _for(i,j,k) for(int i=j;i<k;i++)
#define endl  '\n'
#define inf 1<<29-1 
const int mod=1e9+7;
const int MAX=1e6+5;
int p[12]={2,3,5,7,11,13,17,19,23,29,31};
int a[32],b[1005];
int main() {
 ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int t;
	cin>>t;
	while(t--){
		int n,cnt=0,ans=0;
		cin>>n;
		set<int>st;
		for(int i=0;i<n;i++)
		{
			cin>>b[i];
			for(int j=0;j<11;j++)
			{
				if(b[i]%p[j]==0)
				{
					if(st.count(p[j])==0)
					{
						ans++;
						a[p[j]] = ++cnt;
						b[i] = a[p[j]];
						st.insert(p[j]);
					}
					else b[i] = a[p[j]];
					break;
				}
			}
		}
		cout<<ans<<'\n';
		for(int i=0;i<n;i++)
		cout<<b[i]<<" ";
		cout<<'\n';
	}
}

C.

题意:输入一个长为n的字符串,可以分成n/k段,每段长k,你可以需要改变每段的字符,使得而且每小段相同而且满足自身回文,求需要改变最少的次数

暴力预处理+贪心
你可以考虑到字符串是由26个字符组成的,而且有n/k段每一段都与第一段相同,即每段相同字母的位置相同,故可以开一个二维数组a[i][j]记录每段第i个字符出现的次数。再考虑每段自身的回文和有n/k段,进行贪心min。
需要注意是题目会卡memset,所以只能手动for初始化;注意k的奇偶性质,判断是否需要再贪一次;

2020-6-20
在牛客小白月赛26上遇到这道题的简单版本(无要求自身回文)的题目,有兴趣的同学可以做一下。
牛客小白月赛26-J牛牛喜欢字符串

#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second 
#define ll long long 
#define _for(i,j,k) for(int i=j;i<k;i++)
#define endl  '\n'
#define inf 1<<29-1 
const int mod=1e9+7;
const int MAX=1e6+5; 
ll a[MAX][26];
int main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int t;
	cin>>t;
	while(t--)
	{
		int n,k;
		cin>>n>>k;
		for(int i=0;i<k;i++)
		{
			for(int j=0;j<26;j++)
			{
				a[i][j]=0;		
			}
		}
		string s;
		cin>>s;
		for(int i=0;i<k;i++)
		{
			for(int j=i;j<n;j+=k)
			{
				a[i][s[j]-'a']++;
			}	
		}
		ll ans=0,Max,l=0,r=k-1,d=n/k;
		while(l<r)
		{
		
			Max=MAX;
			for(int j=0;j<26;j++)
			{
				Max=min(Max,2*d-a[l][j]-a[r][j]);
			}
			ans+=Max;
			l++;r--;
		}
		if(l==r)
		{
			Max=MAX;
			for(int i = 0; i < 26; i++) 
			{
				Max=min(Max,d-a[l][i]);
			}
			ans+=Max;
		}
		cout<<ans<<'\n';
	}	
}

D.

题意:题目给的dp求a[i]&a[j]的最大值,1<=i<j<=n,是假dp,求出的值是错误的,你需要构造一个矩阵,使得假dp输出的值和正确的值相差k,

#include <bits/stdc++.h>
using namespace std;
const int inf=1<<17;
int main()
{
    int k;cin>>k;
    cout<<"2 3"<<"\n";
    cout<<(inf+k)<<' '<<k<<' '<<inf<<"\n";
    cout<<inf<<' '<<(inf+k)<<' '<<k;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值