Codeforces Round #630 (Div. 2) A-C

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的奇偶性质,判断是否需要再贪一次;

#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';
	}	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章