被B题橄榄了🥺,菜枯
A. Make it Beautiful
一开始竟然没看到
令
如果a
是ugly
的,那么
即
只需要使数列保证降序即可.
但是最大的两项可能相等,这样就会出现排完序后
需要将
如果后面找不到比 beautiful
.
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=55;
int a[N],sum[N];
bool cmp(int a,int b)
{
return a>b;
}
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cin[0]=0;
sumbool flag=false;
bool flag1=false;
for(int i=1;i<=n;i++)
{
>>a[i];
cin[i]=sum[i-1]+a[i];
sumif(sum[i]==2*sum[i-1])
=true;
flag}
for(int i=2;i<=n;i++)
{
if(a[i]!=a[i-1])
=true;
flag1}
if(!flag1)
<<"NO"<<'\n';
coutelse
{
<<"YES"<<'\n';
coutif(!flag)
{
for(int i=1;i<=n;i++)
<<a[i]<<' ';
cout<<'\n';
cout}
else
{
(a+1,a+1+n,cmp);
sortint j=2;
while(a[j]==a[j-1])
++;
j(a[j],a[2]);
swapfor(int i=1;i<=n;i++)
<<a[i]<<' ';
cout<<'\n';
cout}
}
}
return 0;
}
B. Matrix of Differences
直觉上相邻格子的数的差肯定是可以遍历
然后就是痛苦的构造了,我是这么构造的:
用两个指针,一个从1
递增(记为p
),一个从n
递减(记为q
);
奇数行从左向右构造,偶数行从右向左构造;
p
和q
交替出现.
如
下面证明这样的构造可以遍历所有差
将每一行的相邻两数差写出来,构成一个
距离完全遍历还差
计算第一列的纵向相邻差,观察第
综上,这样构造可以使相邻方格的差遍历
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=55;
int a[N][N];
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinint u=1,v=n*n;
int x=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i%2==1)
{
if(x)
[i][j]=u++;
aelse
[i][j]=v--;
a}
else
{
if(x)
[i][n+1-j]=u++;
aelse
[i][n+1-j]=v--;
a}
^=1;
x}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
<<a[i][j]<<' ';
cout<<'\n';
cout}
}
return 0;
}