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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43819762/article/details/105279786