A. Add Candies
题目传送门:
题目大意:
给你一个n,表示1~n的序列。你可以进行m次操作,每次操作需选中一个其中的一个数,第 j 次操作可以让除了被选中的数的其他所有数加 j 。问你如何构造这样的m次操作使得最后所有数都相等,(操作次数不要求最小)。
思路:
只要使所有数变成1+2+3+……n即可。
AC Code
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int m;
scanf("%d",&m);
printf("%d\n",m);
for(int i=1;i<=m;i++)
printf("%d ",i);
printf("\n");
}
return 0;
}
B. Numbers Box
题目传送门:
题目大意:
给你一个n*m的矩阵,每个位置有一个数aij,可能是正的也可以是负的。相邻的两个数可以同时乘以-1改变符号。问最后矩阵中所有元素的和最大是多少。
思路:
我们可以先从行考虑,我们发现如果一行中有偶数个负数时,那么这一行全部都可以转化为正数。当这一行有奇数个负数时,会留下一个负数。
然后我们再从列考虑,经过行的操作后我们发现每一行最多都只有一个负数,然后我们可以把这个负数转化到同一列上,然后就可以继续进行上述行的操作。
综上得,我们发现,当矩阵中的负数个数为偶数时,可以全部转化为正数,当负数个数为奇数时,我们只要把abs( aij )最小的那个数作为负数即可,其他全为正数。
AC Code
#include<bits/stdc++.h>
using namespace std;
int a[15][15];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d%d",&n,&m);
int num=0;
for(int i=1;i<=n;i++)
{