A. Blackboard List
题意:
给一个数组,这个数组是由其中的两个值通过 其差值的绝对值得到的。输出这两个值的其中一个
思路:
看样例,如果有负数,必然输出负数,因为后得到的只能是非负数。
否则,输出正数的最大值,因为它不可能通知别的两个数减出来;
代码:
void solve()
{
cin>>n;
int f=0;
int mx=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
mx=max(mx,a[i]);
if(a[i]<0) f=a[i];
}
if(!f)
cout<<mx<<endl;
else
cout<<f<<endl;
}
B. Minimize Permutation Subarrays
题意:
给一个数组,可以调换任意两个数的位置,求使得调换后 数组的子串是permutation数组的数量最少
思路:
让数量最少,看样例,即只有1 和本身。
怎么做到呢?如果是permutation数组,那肯定是 1 2 。。1是一定有的,那只要在 1 和 2之间放别的数,让1 2接不上,直到最后才能接上就行。即把n 插在1和2 中间。
所以本题就是找 1 2 n的位置 然后让n和中间的换一个即可。
代码:
int a[N],p[N];
//只要用 n 把 1和2隔开就可以使得子Permutation数组只有1和本身
// 输入中 1 2 n的关系可能有 1 2 n/ 1 n 2/2 1 n/2 n 1/n 1 2/n 2 1
// 只要找到n的位置和中间数字的位置互换即可
void solve()
{
cin>>n;
int t=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]==1) p[++t]=i;
else if(a[i]==2) p[++t]=i;
else if(a[i]==n) p[++t]=i,k=i;
}
sort(p+1,p+4);
cout<<p[2]<<" "<<k<<endl;
}
C. No Prime Differences
题意:
构造一个矩阵 使每个数和上下左右的数的差值都是质数。
思路:
为了不用思考四个方向,我们先按顺序排,先水平排列
//1 2 3 4 5
//6 7 8 9 10
//11 12 13 14 15
//16 17 18 19 20
//上下相邻的差为5 不是质数 但多隔一个就是5*2 隔几个就是5*n 即只要隔着那差值一定不是质数
//所以我们把行的顺序换一下 如果变成 1 11 6 16 会发现中间还是不行 6和11相邻
//从0开始排 行 序号
//只有 6 16 1 11可以 所以我们先排偶数列再排奇数列
//如果先排偶数 那么偶数的最下面一列可能和奇数数的最上一列相邻
//但先排奇数就不会 (因为n>=4)
void solve()
{
cin>>n>>m;
for(int i=1;i<n;i+=2)
{
for(int j=1;j<=m;j++)
cout<<i*m+j<<" ";
cout<<endl;
}
for(int i=0;i<n;i+=2)
{
for(int j=1;j<=m;j++)
cout<<i*m+j<<" ";
cout<<endl;
}
cout<<endl;
}
灵神yyds