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