复盘7.6训练

Posted karshey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复盘7.6训练相关的知识,希望对你有一定的参考价值。

是真的快乐场。

A - Do Not Be Distracted!

原题

Input
5
3
ABA
11
DDBBCCCBBEZ
7
FFGZZZY
1
Z
2
AB
Output
NO
NO
YES
YES
YES

观察一波样例,存在ABA形式的字符串输出NO,否则YES。
即AABBAA也算ABA,相邻重复的不算,有不相邻的重复的就算。

#include<bits/stdc++.h>
using namespace std;
int al[27];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;
		string a,b;cin>>a;
		for(int i=0;a[i];i++)
		{
			if(i==0||a[i]!=a[i-1]) b+=a[i];
		}
		
		memset(al,0,sizeof(al));
		for(int i=0;b[i];i++)
		{
			al[b[i]-'A'+1]++;
		}
		
		int flag=0;
		for(int i=0;i<27;i++)
		{
			if(al[i]>=2) 
			{
				flag++;
				break;
			}
		}
		if(flag) cout<<"NO"<<endl;
		else cout<<"YES"<<endl;
	}
	
	return 0;
}

B - Tit for Tat

原题
字典序,在大于等于0的情况下,在操作次数范围内尽可能前小后大即可。

#include<bits/stdc++.h>
using namespace std;
int a[105];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n,k;cin>>n>>k;
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
		}
		
		for(int i=0;i<n-1;i++)//最后一位不能减 
		{
			if(a[i]<k)
			{
				a[n-1]+=a[i];				
				k-=a[i];
				a[i]=0;
			}
			else
			{
				a[n-1]+=k;
				a[i]-=k;
				k=0;
				break;
			}
		}
		
		for(int i=0;i<n;i++)
		{
			cout<<a[i]<<" ";
		}
		cout<<endl;
	}
	
	return 0;
}

C - Ordinary Numbers

原题
形如999这种每位都是一样的数字称为ordinary number,问在1——n内有几个这样的数。
可以列出函数表达式。别模拟,会T。

#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int ord(int n)
{	
	int o=n%10;
	if(n<10) return 1;
	int flag=0;
	while(n>=10)
	{
		if(n==10) return 0;
		n/=10;
		if(o!=n%10)  return 0;		
	}
	
	 return 1;
}
int main()
{
	int t;cin>>t;
	while(t--)
	{
		long long int n;cin>>n;
		if(n<10) cout<<n<<endl;
		else 
		{
			//求位数
			long long int n1=n,cs=1;
			int w=0;
			while(n1!=0)
			{
				n1/=10;
				w++;
			} 
			long long int ans=0;
			for(int i=1;i<w;i++)
			{
				cs=cs*10+1; 
			}
			ans=(w-1)*9+n/cs;
			cout<<ans<<endl;
		}
	}
}

D - Not Adjacent Matrix

原题
此题要求nxn的矩阵里相邻数字放在不相邻的格子上。
观察一波可知,n==2时不存在这样的矩阵
有多种做法。我的方法:
样例可知:n==3的矩阵已经给出,则n==4的矩阵可以在给出n==3的矩阵外加一层壳即可。即在已知情况下构造矩阵
输入:

3
1
2
3

输出:

1
-1
2 9 7
4 6 3
1 8 5

我的代码:

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int a[N][N];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;
		if(n==1) 
		{
			cout<<1<<endl;
			continue;
		}
		else if(n==2) 
		{
			cout<<-1<<endl;
			continue;
		}
		else
		{
			//3x3
			a[n][1]=1;
			a[n-2][1]=2;
			a[n-1][3]=3;
			a[n-1][1]=4;
			a[n][3]=5;
			a[n-1][2]=6;
			a[n-2][3]=7;
			a[n][2]=8;
			a[n-2][2]=9;
			
			int temp=3;
			while(temp<n)
			{
				int now=temp*temp+1;
				int lie=1;
				//第一次横排 
				while(lie<=temp+1)
				{
					a[n-temp][lie]=now;
					now++;
					lie+=2;
				}
				
				//第一次竖排 
				lie=temp+1;
				int hang;
				if(temp%2==1) hang=n-temp+1;
				else hang=n-temp+2;
				while(hang<=n)
				{
					a[hang][lie]=now;
					now++;
					hang+=2;
				}
				
				
				//第二次横排 
				lie=2;
				hang=n-temp;
				while(lie<=temp+1)
				{
					a[hang][lie]=now;
					now++;
					lie+=2;
				}
				
				//第二次竖排 
				lie=temp+1;
				if(temp%2==1) hang=n-temp+2;
				else hang=n-temp+1;
				while(hang<=n)
				{
					a[hang][lie]=now;
					now++;
					hang+=2;
				}
				temp++;
			}
			
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=n;j++)
				{
					cout<<a[i][j]<<" ";
				}
				cout<<endl;
			}
		}
	}
	
	return 0;
}

同学的做法:奇数偶数分开填入即可。
好聪明!

E - Array Reodering

原题
在这里插入图片描述
最大的good,把偶数从大到小排序放前面,奇数从大到小排序放后面即可。因为后面的会乘以2,即放在后面的要奇数和小的数字最好。

#include<bits/stdc++.h>
using namespace std;
const int N=2005;
int a[N],b[N],c[N];
int cmp(int a,int b)
{
	return a>b;
}

int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		int tempb=0,tempc=0;
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
			if(a[i]%2==0) b[tempb++]=a[i];
			else c[tempc++]=a[i];
		}
		
		sort(b,b+tempb,cmp);
		sort(c,c+tempc,cmp);
		for(int i=0;i<n;i++)
		{
			if(i<tempb)a[i]=b[i];
			else a[i]=c[i-tempb];
		}
		

		int sum=0;
		for(int i=0;i<n-1;i++)
		{
			for(int j=i+1;j<n;j++)
			{
				if(__gcd(a[i],2*a[j])>1) sum++;
			}
		}
		
		cout<<sum<<endl;
	}
	
	return 0;
}

F - Perfectly Imperfect Array

原题
题意:给一组数,是否存在两个数的乘积不是平方数。
若三个数都是平方数,则三个数任意组合的乘积都是平方数。
若存在一非平方数,则与此数的任意组合都不是平方数。
无敌大水题,求是否有非平方数即可。

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int a[N];
int main()
{
	int t;cin>>t;
	while(t--)
	{
		int n;cin>>n;
		memset(a,0,sizeof(a));
		int flag=0;
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
			if(sqrt(a[i])!=(int)(sqrt(a[i]))) flag++;
		}
		
		if(flag) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	
	return 0;
}

以上是关于复盘7.6训练的主要内容,如果未能解决你的问题,请参考以下文章

CentOS 7.6 搭建Gitlab教程

编程初级训练营复盘

复盘7.8训练

复盘7.12训练

复盘8.17训练:UCF Local Programming Contest Final Round

复盘7.21训练:UCF Local Programming Contest Round 1A