复盘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训练的主要内容,如果未能解决你的问题,请参考以下文章