cf1332

A題鏈接

題目大意:給你一個a,b,c,d,分別代表向左走a步,向右走b步,向下走c步,向上走d步,而且你走的每一步都不能超過[x1,y1],[x2,y2]

解題思路:左右的話可以左右各抵消一步,最後多出來的去判斷是否超過範圍,上下一樣,需要特判一種情況就是給你的範圍的x1=x2=x,y1=y2=y;因爲−108≤x1≤x≤x2≤108, −108≤y1≤y≤y2≤108,題目中的範圍是這樣的,所以直接判斷x1==x2,y1==y2就可以了,x1==x2的話,也一定是等於x的,y同理

代碼如下: 

#include<iostream>
#include<algorithm>
#include<map>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
	int t;
	long long u,v,x1,x2,y1,y2;
	long long a,b,c,d,x,y,e,f,g,h;
	cin>>t;
	while(t--)
	{
		cin>>a>>b>>c>>d;
		x=abs(a-b);
		y=abs(c-d);
		cin>>u>>v;
		cin>>x1>>y1>>x2>>y2;
		if(a<b)
		{
			u+=x;
		}
		else
		{
			u-=x;
		}
		if(c>d)
		{
			v-=y;
		}
		else
		{
			v+=y;
		}
		if((x1==x2)&&(a>0||b>0))
		  cout<<"No"<<endl;
		else if((y1==y2)&&(c>0||d>0))
		  cout<<"No"<<endl;
		else if(u>=x1&&u<=x2&&v>=y1&&v<=y2)
		  cout<<"Yes"<<endl;
		else
		  cout<<"No"<<endl;
    }
    return 0;
} 

 

B題鏈接

題目大意:給n個數字(1≤n≤1000,數字都是合數)染色,相同顏色的數的 gcd>1 ,然後顏色的種類數m不能超過11,並且假如用了m種顏色,那麼1~m中的任意一種顏色都要至少被使用一次;

解題思路:1000開平方約等於31 ,在1-31的數中只有 2,3,5,7,11,13,17,19,23,29,31  emm比賽當晚思路就到這裏了,不知道用代碼怎麼實現,無從下手。。唉。。還是菜啊!!好久沒寫題解了 今天必須記錄下這個題來

代碼如下:

#include<iostream>
#include<cstring>
using namespace std;
const int maxn=1e4+10;
int a[maxn];
int c[maxn];
int b[11]={2,3,5,7,11,13,17,19,23,29,31};
int main()
{
	int n,t,i,j,k,flag;
	cin>>t;
	while(t--)
	{
		cin>>n;
		k=1;
		memset(c,0,sizeof(c));
		for(i=0;i<n;i++)
		  cin>>a[i];
		for(i=0;i<11;i++)
		{
			flag=0;
			for(j=0;j<n;j++)
			{
				if(c[j]==0&&a[j]%b[i]==0)
				{
					c[j]=k;
					flag=1;
				}	
			} 
			if(flag)
			  k++;
		}
		cout<<k-1<<endl;
		cout<<c[0];
		for(i=1;i<n;i++)
		  cout<<" "<<c[i];
		cout<<endl;
    } 
    return 0;
}

C題鏈接

題目大意:給一個長度爲n的字符串,讓你將它修改成n/k段(即每段長度爲k)相等的迴文段,求最小的修改次數

解題思路:因爲是n/k個相等的而且是迴文串,所以一次判斷哪個相等字符的位置出現的次數最多的字符是多少就行,修改的次數就是(num-maxx),num是統計的哪個位置還沒修改的個數,

代碼如下:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=2e5+10;
char s[maxn];
int v[maxn];
int a[110];
int main()
{
	int t,n,k,i,j;
	int ans,num,maxx;
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		scanf("%s",s+1);
		for(i=1;i<=n;i++)
		  v[i]=0;
		ans=0;
		for(i=1;i<=n;i++)
		{
			if(v[i])
			  continue;
			num=0;
		    maxx=0;
			memset(a,0,sizeof(a));
			for(j=i;j<=n;j+=k)
			{
				if(v[j])
				  break;
				v[j]++;
				num++;
				a[s[j]-'a']++;
				maxx=max(maxx,a[s[j]-'a']);
			}
			for(j=n-i+1;j>=1;j-=k)
			{
				if(v[j])
				  break;
				v[j]++;
				num++;
				a[s[j]-'a']++;
				maxx=max(maxx,a[s[j]-'a']);
			}
			ans+=(num-maxx);
		}
		cout<<ans<<endl;
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章