题目链接:http://codeforces.com/contest/816/problem/C

题意:给出一个矩阵,问能否从都是0的情况下只将一整行+1或者一整列+1变形过来,如果可以输出需要步数最小的情况。不能输出-1

题解:就是一道模拟题,然后关于最小的只要考虑一种情况,就是当前行可以消除,也可以消除全部列的时候要考虑要删行还是删列,这个取决于n于m的大小

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int Max_Size = 5e2 + 10;
int a[Max_Size][Max_Size] , Minrow[Max_Size] , Mincol[Max_Size];
struct TnT {
string pos;
int num;
}T[Max_Size * Max_Size];
int main() {
int n , m;
cin >> n >> m;
for(int i = 1 ; i <= n ; i++) {
for(int j = 1 ; j <= m ; j++) {
cin >> a[i][j];
}
}
memset(Minrow , 0 , sizeof(Minrow));
memset(Mincol , 0 , sizeof(Mincol));
for(int i = 1 ; i <= n ; i++) {
int Min = Max_Size;
for(int j = 1 ; j <= m ; j++) {
Min = min(Min , a[i][j]);
}
Minrow[i] = Min;
}
for(int i = 1 ; i <= m ; i++) {
int Min = Max_Size;
for(int j = 1 ; j <= n ; j++) {
Min = min(Min , a[j][i]);
}
Mincol[i] = Min;
}
int ans = 0;
for(int i = 1 ; i <= n ; i++) {
if(m > n) {
for(int j = 1 ; j <= m ; j++) {
a[i][j] -= Minrow[i];
Mincol[j] = min(Mincol[j] , a[i][j]);
}
for(int j = 1 ; j <= Minrow[i] ; j++) {
T[ans].pos = "row";
T[ans].num = i;
ans++;
}
Minrow[i] = 0;
}
}
for(int i = 1 ; i <= m ; i++) {
if(m <= n) {
for(int j = 1 ; j <= n ; j++) {
a[j][i] -= Mincol[i];
Minrow[j] = min(Minrow[j] , a[j][i]);
}
for(int j = 1 ; j <= Mincol[i] ; j++) {
T[ans].pos = "col";
T[ans].num = i;
ans++;
}
Mincol[i] = 0;
}
}
for(int i = 1 ; i <= n ; i++) {
for(int j = 1 ; j <= m ; j++) {
a[i][j] -= Minrow[i];
Mincol[j] = min(Mincol[j] , a[i][j]);
}
for(int j = 1 ; j <= Minrow[i] ; j++) {
T[ans].pos = "row";
T[ans].num = i;
ans++;
}
Minrow[i] = 0;
}
for(int i = 1 ; i <= m ; i++) {
for(int j = 1 ; j <= n ; j++) {
a[j][i] -= Mincol[i];
Minrow[j] = min(Minrow[j] , a[j][i]);
}
for(int j = 1 ; j <= Mincol[i] ; j++) {
T[ans].pos = "col";
T[ans].num = i;
ans++;
}
Mincol[i] = 0;
}
int flag = 0;
for(int i = 1 ; i <= n ; i++) {
for(int j = 1 ; j <= m ; j++) {
if(a[i][j]) flag = 1;
}
}
if(!flag) {
cout << ans << endl;
for(int i = 0 ; i < ans ; i++) cout << T[i].pos << ' ' << T[i].num << endl;
}
else cout << -1 << endl;
return 0;
}

最新文章

  1. 解决 Error: getaddrinfo EADDRINFO 错误
  2. 【随笔】MQTT简介
  3. ul+li标签制作表格
  4. [cocos2dx笔记004] android添加�静态库project
  5. FaceBook要在视频领域打败YouTube?
  6. 如何安全退出已调用多个Activity的Application?
  7. 如何一步一步用DDD设计一个电商网站(十二)—— 提交并生成订单
  8. Memcached【第二篇】高可用集群搭建
  9. Require,js配置使用心得
  10. 什么是Linux主机?
  11. 5分钟学会使用gitlab
  12. 1_Two Sum --LeetCode
  13. 使用spark访问hive错误记录
  14. BZOJ1774[USACO 2009 Dec Gold 2.Cow Toll Paths]——floyd
  15. tips: javascript 参数传递含有空格怎么办?
  16. RabbitMQ文档翻译——Work queues
  17. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.2 no-loop
  18. 十大opengl教程
  19. [转载] MATLAB快捷键
  20. 集合-强大的集合工具类:java.util.Collections中未包含的集合工具

热门文章

  1. 不等&quot;金九银十&quot;,金风八月,我早已拿下字节跳动的offer
  2. Extjs4 combobox hiddenName 后台取不到值
  3. Hyper-v设置linux固定ip
  4. Redis的分布式和主备配置调研
  5. java中什么是继承笔记
  6. 浅谈osi模型 三次握手 四次挥手 ddos攻击原理
  7. 章节十五、8-配置文件File Logging
  8. 基于jmeter+perfmon的稳定性测试记录
  9. 洛谷 P2157 [SDOI2009]学校食堂
  10. windows下通过idea连接hadoop和spark集群