Codeforces Round #419 (Div. 2)C. Karen and Game

C. Karen and Game

给定n行m列数字,每次可以让一行或一列都减一,求出让全部数字全为0的最小的次数,没有则输出-1;

比赛时没有考虑,n和m的大小问题,被hack了。5555555555555555555555555555

好的方法没有想到,只有一个死方法了。

  1 #include <iostream>
  2 #include <stdio.h>
  3 #define long long ll
  4 using namespace std;
  5 int a[110][110], n, m,b[110][110];
  6 bool check(){
  7     for(int i = 1; i <= n; i ++){
  8         for(int j = 1; j <= m; j ++){
  9             if(a[i][j] != 0){
 10                 return true;
 11             }
 12         }
 13     }
 14     return false;
 15 }
 16
 17 int main(){
 18     cin >> n >> m;
 19     for(int i = 1; i <= n; i ++){
 20         for(int j = 1; j <= m; j ++){
 21 //            scanf("%d",&a[i][j]);
 22             cin >> a[i][j];
 23             b[i][j] = a[i][j];
 24         }
 25     }
 26     int sum, flag = 1, i = 1,j = 1, ans = 0;
 27     if(n <= m){
 28         while(i <= n){
 29             sum = 0;
 30             flag = 1;
 31             for(int k = 1; k <= m; k ++){
 32                 if(!a[i][k]){
 33                     flag = 0;
 34                     break;
 35                 }
 36             }
 37             if(flag){
 38                 ans++;
 39                 for(int k = 1; k <= m; k ++) a[i][k] -= 1;
 40             }else i++;
 41         }
 42         while(j <= m){
 43             sum = 0;
 44             flag = 1;
 45             for(int k = 1; k <= n; k ++){
 46                 if(!a[k][j]){
 47                     flag = 0;
 48                     break;
 49                 }
 50             }
 51             if(flag){
 52                 ans ++;
 53                 for(int k = 1; k <= n; k ++) a[k][j] -= 1;
 54             }else j++;
 55         }
 56     }else{
 57         while(j <= m){
 58             sum = 0;
 59             flag = 1;
 60             for(int k = 1; k <= n; k ++){
 61                 if(!a[k][j]){
 62                     flag = 0;
 63                     break;
 64                 }
 65             }
 66             if(flag){
 67                 ans ++;
 68                 for(int k = 1; k <= n; k ++) a[k][j] -= 1;
 69             }else j++;
 70         }
 71         while(i <= n){
 72             sum = 0;
 73             flag = 1;
 74             for(int k = 1; k <= m; k ++){
 75                 if(!a[i][k]){
 76                     flag = 0;
 77                     break;
 78                 }
 79             }
 80             if(flag){
 81                 ans++;
 82                 for(int k = 1; k <= m; k ++) a[i][k] -= 1;
 83             }else i++;
 84         }
 85     }
 86     if(check()){
 87         cout << -1 << endl;
 88         return 0;
 89     }
 90     cout << ans << endl;
 91     i = j = 1;
 92     if(n <= m){
 93         while(i <= n){
 94             sum = 0;
 95             flag = 1;
 96             for(int k = 1; k <= m; k ++){
 97                 if(!b[i][k]){
 98                     flag = 0;
 99                     break;
100                 }
101             }
102             if(flag){
103                 cout << "row " << i << endl;
104                 for(int k = 1; k <= m; k ++) b[i][k] -= 1;
105             }else i++;
106         }
107         while(j <= m){
108             sum = 0;
109             flag = 1;
110             for(int k = 1; k <= n; k ++){
111                 if(!b[k][j]){
112                     flag = 0;
113                     break;
114                 }
115             }
116             if(flag){
117                 cout << "col " << j << endl;
118                 for(int k = 1; k <= n; k ++) b[k][j] -= 1;
119             }else j++;
120         }
121     }else{
122         while(j <= m){
123             sum = 0;
124             flag = 1;
125             for(int k = 1; k <= n; k ++){
126                 if(!b[k][j]){
127                     flag = 0;
128                     break;
129                 }
130             }
131             if(flag){
132                 cout << "col " << j << endl;
133                 for(int k = 1; k <= n; k ++) b[k][j] -= 1;
134             }else j++;
135         }
136         while(i <= n){
137             sum = 0;
138             flag = 1;
139             for(int k = 1; k <= m; k ++){
140                 if(!b[i][k]){
141                     flag = 0;
142                     break;
143                 }
144             }
145             if(flag){
146                 cout << "row " << i << endl;
147                 for(int k = 1; k <= m; k ++) b[i][k] -= 1;
148             }else i++;
149         }
150     }
151     return 0;
152 }

时间: 2024-08-08 10:31:36

Codeforces Round #419 (Div. 2)C. Karen and Game的相关文章

Codeforces Round #419 (Div. 2) E. Karen and Supermarket(树形DP)

题目链接:Codeforces Round #419 (Div. 2) E. Karen and Supermarket 题意: 有n件物品,每个物品有一个价格,和一个使用优惠券的价格,不过这个优惠券有一个限制,必须要在第x个使用后才可以使用.现在有m的钱,问最多能买多少个物品. 题解: 每个优惠券都只与一个券有关,所以根据这个关系就可以构成一棵树. 考虑树形dp,dp[i][j][k(0|1)]表示第i个节点所构成的子树中买了j个物品,使用优惠券和不使用优惠券的最少钱. 转移方程看代码详细解释

Codeforces Round #419 (Div. 2)B. Karen and Coffee

B. Karen and Coffee 题意:给定n个区间,当一个数在k个区间以内则这个数可以被选中.有q个询问,问在某个区间能有多少个数可以被选中. 1 #include <iostream> 2 #include <stdio.h> 3 using namespace std; 4 const int MAX_N = 2e5+10; 5 int a[MAX_N], c[MAX_N], n, k, q; 6 int main(){ 7 int l, r; 8 scanf(&quo

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

容易发现,删除的顺序不影响答案. 所以可以随便删. 如果行数大于列数,就先删列:否则先删行. #include<cstdio> #include<algorithm> using namespace std; int p1,ans1[510*110],ans2[510*110],p2; int n,m,a[110][110]; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;++i){ f

【找规律】【递推】【二项式定理】Codeforces Round #419 (Div. 1) B. Karen and Test

打个表出来看看,其实很明显. 推荐打这俩组 11 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000 12 1 10 100 1000 10000 100000 1000000 10000000 100000000 1000000000 10000000000 100000000000 打出表来看出来,n为偶数时,每隔两行,对原序列的奇数项分配的权重形成二项展开式. n为奇数时,每隔四行,形成二

Codeforces Round #419 (Div. 2) A-E

上紫啦! E题1:59压哨提交成功翻盘 (1:00就做完了调了一个小时,还好意思说出来? (逃)) 题面太长就不复制了,但是配图很可爱所以要贴过来 九条可怜酱好可爱呀 A - Karen and Morning 询问从当前时刻过多久,时间会形成回文串的形式. 暴力呀暴力 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<

Codeforces Round #419 (Div. 1) 补题 CF 815 A-E

A-C传送门 D Karen and Cards 技巧性很强的一道二分优化题 题意很简单 给定n个三元组,和三个维度的上限,问存在多少三元组,使得对于给定的n个三元组中的每一个,必有两个维度严格小于. 首先我们根据一个维度(c维)对n个三元组排序,然后枚举答案在这个维度的取值. 此时序列被分成了两个部分,前半部分 满足所有c大于等于i 后半部分满足所有c严格小于i(即已有一个维度小于) 通过累计,我们知道此时前半部a维的最大值ma和b维的最大值mb. 显然可能存在的三元组答案,必然首先满足a维和

Codeforces Round #419 (Div. 2)

1.题目A:Karen and Morning 题意: 给出hh:mm格式的时间,问至少经过多少分钟后,该时刻为回文字符串? 思路: 简单模拟,从当前时刻开始,如果hh的回文rh等于mm则停止累计.否则,根据rh和mm的大小来累计sum,然后hh+1,不断尝试. 1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int hh,mm; 6 char c; 7 while (cin >> hh >>

Codeforces Round #419 (Div. 1) (ABCDE)

1. 815A Karen and Game 大意: 给定$nm$矩阵, 每次选择一行或一列全部减$1$, 求最少次数使得矩阵全$0$ 贪心, $n>m$时每次取一列, 否则取一行 #include <iostream> #include <sstream> #include <algorithm> #include <cstdio> #include <cmath> #include <set> #include <ma

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/