On the way to school, Karen became fixated on the puzzle game on her phone!
The game is played as follows. In each level, you have a grid with n rows and m columns. Each cell originally contains the number 0.
One move consists of choosing one row or column, and adding 1 to all of the cells in that row or column.
To win the level, after all the moves, the number in the cell at the i-th row and j-th column should be equal to gi, j.
Karen is stuck on one level, and wants to know a way to beat this level using the minimum number of moves. Please, help her with this task!
The first line of input contains two integers, n and m (1 ≤ n, m ≤ 100), the number of rows and the number of columns in the grid, respectively.
The next n lines each contain m integers. In particular, the j-th integer in the i-th of these rows contains gi, j (0 ≤ gi, j ≤ 500).
If there is an error and it is actually not possible to beat the level, output a single integer -1.
Otherwise, on the first line, output a single integer k, the minimum number of moves necessary to beat the level.
The next k lines should each contain one of the following, describing the moves in the order they must be done:
- row x, (1 ≤ x ≤ n) describing a move of the form "choose the x-th row".
- col x, (1 ≤ x ≤ m) describing a move of the form "choose the x-th column".
If there are multiple optimal solutions, output any one of them.
3 5
2 2 2 3 2
0 0 0 1 0
1 1 1 2 1
4
row 1
row 1
col 4
row 3
3 3
0 0 0
0 1 0
0 0 0
-1
3 3
1 1 1
1 1 1
1 1 1
3
row 1
row 2
row 3
In the first test case, Karen has a grid with 3 rows and 5 columns. She can perform the following 4 moves to beat the level:
In the second test case, Karen has a grid with 3 rows and 3 columns. It is clear that it is impossible to beat the level; performing any move will create three 1s on the grid, but it is required to only have one 1 in the center.
In the third test case, Karen has a grid with 3 rows and 3 columns. She can perform the following 3 moves to beat the level:
Note that this is not the only solution; another solution, among others, is col 1, col 2, col 3.
题解:
简单贪心,看似有很多决策,其实并不存在最优解,只需一行一列的加即可
被hack的时候发现了刚开始加行和加列有区别 然后强行改对
但神tm a[j][i]写成a[i][j] 挂了一个点
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const int N=105; 7 int a[N][N],b[N][N],Lm[N],Lx[N],rm[N],rx[N],sum=0,n,m,ans1=0,ans2=0,ansi[N],ansj[N],ansi2[N],ansj2[N]; 8 void work() 9 { 10 for(int i=1;i<=m;i++) 11 { 12 ansj[i]=rm[i];sum-=rm[i]*n;ans1+=rm[i]; 13 for(int j=1;j<=n;j++) 14 { 15 a[j][i]-=rm[i]; 16 if(a[j][i]<Lm[j])Lm[j]=a[j][i]; 17 } 18 } 19 for(int i=1;i<=n;i++) 20 { 21 ansi[i]=Lm[i];sum-=Lm[i]*m;ans1+=Lm[i]; 22 } 23 for(int i=1;i<=n;i++)Lm[i]=Lx[i],rm[i]=rx[i]; 24 for(int i=1;i<=n;i++) 25 { 26 ansi2[i]=Lm[i];ans2+=Lm[i]; 27 for(int j=1;j<=m;j++) 28 { 29 b[i][j]-=Lm[i]; 30 if(b[i][j]<rm[j])rm[j]=b[i][j]; 31 } 32 } 33 for(int i=1;i<=m;i++) 34 { 35 ansj2[i]=rm[i];ans2+=rm[i]; 36 } 37 if(sum)printf("-1"); 38 else 39 { 40 if(ans1<ans2) 41 { 42 printf("%d ",ans1); 43 for(int i=1;i<=n;i++)for(int j=1;j<=ansi[i];j++)printf("row %d ",i); 44 for(int j=1;j<=m;j++)for(int i=1;i<=ansj[j];i++)printf("col %d ",j); 45 } 46 else 47 { 48 printf("%d ",ans2); 49 for(int i=1;i<=n;i++)for(int j=1;j<=ansi2[i];j++)printf("row %d ",i); 50 for(int j=1;j<=m;j++)for(int i=1;i<=ansj2[j];i++)printf("col %d ",j); 51 } 52 } 53 } 54 int main() 55 { 56 scanf("%d%d",&n,&m); 57 for(int i=1;i<=n;i++) 58 { 59 Lm[i]=2e8; 60 for(int j=1;j<=m;j++) 61 { 62 scanf("%d",&a[i][j]); 63 sum+=a[i][j];b[i][j]=a[i][j]; 64 if(a[i][j]<Lm[i])Lm[i]=a[i][j],Lx[i]=a[i][j]; 65 } 66 } 67 for(int i=1;i<=m;i++){rm[i]=2e8;for(int j=1;j<=n;j++)if(a[j][i]<rm[i])rm[i]=a[j][i],rx[i]=a[j][i];} 68 work(); 69 return 0; 70 }