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

题意 :给出一个 n*m 的变化后的矩阵,变化前矩阵的元素全是0,变化的规则是选择其中的一行或者一列将元素进行加一操作,问你最少用几步操作能将全零的矩阵变成一开始输入的矩阵,如果无法做到则输出-1,否则输出操作的总次数以及具体的操作步骤。

分析 :如果跟着题意顺着想如何从全零矩阵进行变化那可能比较费劲,不如将一开始输入的矩阵进行减的操作(即逆操作)使其最后变成全零矩阵可能会更简单操作,因为只是在原始矩阵进行变化。那如何减呢?可以注意到如果我们先枚举行的话,比如第1行,试想一下第一行最多能够进行多少次减的操作?不难想到这一行中最小的数便是可以进行的操作数,那我们只要枚举所有的行和列找出每一行的最小值,如果最小值>0则进行模拟操作并且记录方便最后的输出。但是这里有个坑,就是题目要求的是最小的操作总数,那对于一个所有元素都相同但是行数和列数都不相同的矩阵便有区别了,例如矩阵的元素都是1,但是n>m,如果此时先枚举1~n那便不是最优了,所以要注意枚举行和列的先后顺序,取决于n和m的相对大小。还有一个就是题目有无法实现就输出-1的情况,这里我们只要在一开始输入矩阵的时候记录所有元素的和,然后在减的时候我们不难得出减的总合,如果减的总和!=原矩阵元素总和,则说明无法实现。

#include<bits/stdc++.h>
using namespace std;
;
int G[maxn][maxn];
int n, m;
int row[maxn];
int col[maxn];
;
;
inline void col_work()
{
    ; i<m; i++){
        int Min = 0x3f3f3f3f;
        ; j<n; j++){
            if(G[j][i] < Min)
                Min = G[j][i];
        }
        ){
            col_cnt++;
            col[i]++;
            ; j<n; j++){
                G[j][i]--;
            }
            i--;//因为减一次可能还不够,所以再判断一次这列是否可以再减
        }
    }
}
inline void row_work()
{
    ; i<n; i++){
        int Min = 0x3f3f3f3f;
        ; j<m; j++){
            if(G[i][j] < Min)
                Min = G[i][j];
        }
        ){
            row_cnt++;
            row[i]++;
            ; j<m; j++){
                G[i][j]--;
            }
            i--;
        }
    }
}
int main(void)
{
    ;
    scanf("%d %d", &n, &m);
    ; i<n; i++){
        ; j<m; j++){
            scanf("%d", &G[i][j]);
            sum += G[i][j];
        }
    }
    if(n > m){
        col_work();
        row_work();
    }else{
        row_work();
        col_work();
    }
    if((row_cnt * m + col_cnt * n)!=sum){//无法实现的情况
        puts("-1");
        ;
    }
    printf("%d\n", row_cnt+col_cnt);
    ; i<n; i++){
        while(row[i]--)//这里用一个row数组来记录这一行进行了多少次减操作,col数组也是同样道理
            printf();
    }
    ; i<m; i++){
        while(col[i]--)
            printf();
    }
    ;
}

#419 Div2 Problem C Karen and Game (贪心 && 暴力)的更多相关文章

  1. #419 Div2 Problem B Karen and Coffee (统计区间重叠部分 && 前缀和)

    题目链接 :http://codeforces.com/contest/816/problem/B 题意 :给出 n 表示区间个数,限定值 k 以及问询次数 q,当一个数被大于或等于 k 个区间重复覆 ...

  2. ZOJ Problem Set - 3829Known Notation(贪心)

    ZOJ Problem Set - 3829Known Notation(贪心) 题目链接 题目大意:给你一个后缀表达式(仅仅有数字和符号),可是这个后缀表达式的空格不幸丢失,如今给你一个这种后缀表达 ...

  3. 816C. Karen and Game 贪心

    LINK 题意:给出n*m的矩阵图,现有对行或对列上的数减1的操作,问最少几步使所有数变为0,无解输出-1 思路:贪心暴力即可.先操作行和先操作列结果可能不同注意比较. /** @Date : 201 ...

  4. Codeforces 990 调和级数路灯贪心暴力 DFS生成树两子树差调水 GCD树连通块暴力

    A 水题 /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace ...

  5. The 10th Shandong Provincial Collegiate Programming Contest H.Tokens on the Segments(贪心+优先级队列 or 贪心+暴力)

    传送门 •题意 二维平面上有 n 条线段,每条线段坐标为 $(l_i,i),(r_i,i)$: 平面上的每个整点坐标上都可以放置一枚硬币,但是要求任意两枚硬币的横坐标不相同: 问最多有多少条线段可以放 ...

  6. #433 Div2 Problem C Planning (贪心 && 优先队列)

    链接 : http://codeforces.com/contest/854/problem/C 题意 : 有 n 架飞机需要分别在 1~n 秒后起飞,允许起飞的时间是从 k 秒后开始,给出每一架飞机 ...

  7. 【贪心】 Codeforces Round #419 (Div. 1) A. Karen and Game

    容易发现,删除的顺序不影响答案. 所以可以随便删. 如果行数大于列数,就先删列:否则先删行. #include<cstdio> #include<algorithm> usin ...

  8. BZOJ4977 八月月赛 Problem G 跳伞求生 set 贪心

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4977 - 八月月赛 Problem G 题意 小明组建了一支由n名玩家组成的战队,编号依次为1到n ...

  9. Codeforces Round #419 (Div. 2) B. Karen and Coffee(经典前缀和)

    http://codeforces.com/contest/816/problem/B To stay woke and attentive during classes, Karen needs s ...

随机推荐

  1. 2019JAVA第四次实验报告

    JAVA实验报告 班级 计科二班 学号 20188442 姓名 吴怡君 完成时间 2019/9/29 评分等级 实验四 类的继承 1.实验目的 掌握类的继承方法: 变量的继承和覆盖,方法的继承.重载和 ...

  2. 【转】iptables命令、规则、参数详解

    表    (table)包含4个表:4个表的优先级由高到低:raw-->mangle-->nat-->filterraw---RAW表只使用在PREROUTING链和OUTPUT链上 ...

  3. idea工具

    1. 使用IntelliJ IDEA 配置JDK(入门)   https://blog.csdn.net/nobb111/article/details/77116259 2. idea 调试快捷键  ...

  4. 干货 | 深入分析 string.intern() 方法

    首先我们来看一段代码: public class InternTest {      public static void main(String[] args) {     String str1 ...

  5. 【6.18校内test】T2分数线划定

    分数线划定[题目链接] 这道题也不是什么难题,思路一带而过吧: SOLUTION: First.输入n,m,计算m*1.5的值,接着输入编号和成绩,然后我的做法是在输入编号成绩之后,开一个101大小的 ...

  6. Office批量授权(VL)版本和激活方法

    Office 2010 Office 2010中文专业增强版 32位 文件名: SW_DVD5_Office_Professional_Plus_2010w_SP1_W32_ChnSimp_CORE_ ...

  7. Python进阶编程 面向对象

    一.面向对象 1.1面向对象的基本格式 class 类名: def 方法名(self): print(123) return 123 def 方法名(self): print(123) return ...

  8. 解决sudo用户找不到环境变量的问题

    出于安全方面的考虑,使用sudo执行命令将在一个最小化的环境中执行,环境变量都重置成默认状态.所以PATH这个变量不包括用户自定义设置的内容 在sudo用户的主目录里的.bashrc中添加如下内容即可 ...

  9. RabbitMQ入门教程(一):安装和常用命令

    原文:RabbitMQ入门教程(一):安装和常用命令 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

  10. [转载]神经网络偏置项(bias)的设置及作用

    [转载]神经网络偏置项(bias)的设置及作用 原文来自:https://www.cnblogs.com/shuaishuaidefeizhu/p/6832541.html 1.什么是bias? 偏置 ...