题目链接: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. Dubbo基础、高级讲解

    基础 https://blog.csdn.net/hardworking0323/article/category/6148466 高级 https://blog.csdn.net/hardworki ...

  2. Java第四周总结报告

    本周做了什么? 学习了Java的面向对象知识,包括对类,对象,抽象的理解 下周准备做什么? 学习Java面向对象的有关知识,包括对象与类,继承关系等内容 代码联系时间五个小时,看书四个小时. 本周遇到 ...

  3. POJ 2955 Brackets 区间DP 入门

    dp[i][j]代表i->j区间内最多的合法括号数 if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']') dp[i][j] ...

  4. Python 入门之 内置模块 -- hashlib模块

    Python 入门之 内置模块 -- hashlib模块 1.hashlib 摘要算法,加密算法 (1)主要用途: <1> 加密 : md5 sha1 sha256 sha512 md5, ...

  5. hdu2444The Accomodation of Students (最大匹配+判断是否为二分图)

    题意 首先判断所有的人可不可以分成两部分,每部分内的所有人都相互不认识.如果可以分成 则求两部分最多相互认识的对数. 解题 类似分成两组,同组互不相关,就可能使判断是否为二分图 能否分成两部分 则是判 ...

  6. 解决:centos配置ssh免密码登录后仍要输入密码

    转自https://www.jb51.net/article/121180.htm 第一步:在本机中创建秘钥 1.执行命令:ssh-keygen -t rsa 2.之后一路回车就行啦:会在-(home ...

  7. TCP的三次握手与四次挥手理解及面试题

    TCP的三次握手与四次挥手理解及面试题(很全面) 转载自:https://blog.csdn.net/qq_38950316/article/details/81087809 本文经过借鉴书籍资料.他 ...

  8. MySQL的简单条件判断语句

    在MySQL中条件判断语句常用于数据转换,基于现有数据创建新的数据列,使用场景还是比较多. 基础样式: CASE WHEN`条件`THEN`结果` ELSE`默认结果` END 在同一条判断语句中可以 ...

  9. zabbix简单的操作(添加主机)

    zabbix是一种监控软件,我用的是centos7.5版本 Zabbix是一个基于WEB界面的提供分布式监视功能的企业级的开源解决方案. Zabbix既可以监控操作系统(Linux/Windows/A ...

  10. 关于3.1 jmu-Java-03面向对象基础-01-构造函数与toString (3 分)

    PTA显示Compiler did not create the expected binary 不知所措   package nn;  import java.util.Scanner;       ...