zoukankan      html  css  js  c++  java
  • Codeforces 733C:Epidemic in Monstropolis(暴力贪心)

    http://codeforces.com/problemset/problem/733/C

    题意:给出一个序列的怪兽体积 ai,怪兽只能吃相邻的怪兽,并且只有体积严格大于相邻的怪兽才能吃,吃完之后,这只怪兽的体积会变成原体积 + 吃的怪兽的体积,接下来给出 k 个怪兽的体积 bi,问能不能满足经过一系列操作后让剩下的怪兽体积变得满足下面的序列。

    思路:昨晚想的时候觉得好复杂,今天补题发现实际上只有一种情况,就是每一个区间里的怪兽体积对应于一个 bi,然后拆成 k 个区间,分别找区间里面最大的去吃小的,这里可能有同时多个最大的,分别对每一种情况进行枚举,看可不可以让这个区间剩下一只怪兽,如果可以就进行下一个区间的操作,不行的话答案一定是不行的,因为前面不满足,后面就算满足了也没用。记得判一下最后分得的区间数是否刚好等于 k,在第104个test(如下)错了一发。 我觉得自己在CF或者BC中很容易给自己定个档次,就是如果AC人数不超过多少个,我觉得自己就做不出这题(难度大),但是其实这道题是完全可以弄出来的,只不过很可能卡在这104样例过不去。以后应该更加耐心,沉着,勇于挑战,不要那么浮躁。不然这样进步肯定是不大的。永远落在后面。

    2
    1 2
    2
    3 1
      1 #include <cstdio>
      2 #include <algorithm>
      3 #include <iostream>
      4 #include <cstring>
      5 #include <string>
      6 #include <cmath>
      7 #include <queue>
      8 #include <vector>
      9 using namespace std;
     10 #define N 505
     11 #define INF 0x3f3f3f3f
     12 int sum[N], d[N], b[N], a[N], n;
     13 typedef pair <int, int> P;
     14 vector<P> out[N];
     15 vector<int> vec[N];
     16 vector<int> big, tmp;
     17 
     18 int check(int i) // 判断这个区间满足与否
     19 {
     20     if(sum[i] == b[i]) return 0;
     21     else if(sum[i] < b[i]) return -1;
     22     else return 1;
     23 }
     24 
     25 bool solve(int x) // 有了区间对这个区间进行判断是否可以组成 b[x]
     26 {
     27     for(int i = 1; i <= n; i++) a[i] = d[i];
     28     int cnt = 0;
     29     int ma = 0;
     30     big.clear();
     31     int n = vec[x].size();
     32     for(int i = 0; i < n; i++) {
     33         int id = vec[x][i];
     34         if(a[id] > ma) ma = a[id];
     35     }
     36     for(int i = 0; i < n; i++) {
     37         int id = vec[x][i];
     38         if(ma == a[id]) big.push_back(id);
     39     }
     40     int m = big.size();
     41     int l = vec[x][0], r = vec[x][n-1], L, R;
     42     for(int i = 0; i < m; i++) {
     43         L = l, R = r;
     44         tmp.clear();
     45         out[x].clear();
     46         for(int j = 0; j < n; j++) tmp.push_back(vec[x][j]);
     47         int bb = big[i];
     48         bool flag = 1;
     49         while(L < R && flag) {
     50 //            printf("bbbbb: %d
    ", bb);
     51             if(bb > L) {
     52                 if(a[bb] > a[bb-1]) {
     53 //                    printf("bb :%d
    ", bb);
     54                     a[bb-1] += a[bb];
     55                     out[x].push_back(make_pair(bb, 0));
     56 //                    printf("LLL
    ");
     57                     bb--;
     58                     for(int i = bb + 2; i <= R; i++) a[i-1] = a[i];
     59                     R--;
     60 //                    printf("%d %d
    ", L, R);
     61                     continue;
     62                 }
     63             }
     64             if(bb < R) {
     65                 if(a[bb] > a[bb+1]) {
     66 //                    printf("bb :%d
    ", bb);
     67                     a[bb] += a[bb+1];
     68                     for(int i = bb + 2; i <= R; i++) a[i-1] = a[i];
     69                     out[x].push_back(make_pair(bb, 1));
     70 //                    printf("RRR
    ");
     71                     R--;
     72 //                    printf("%d %d
    ", L, R);
     73                     continue;
     74                 }
     75             }
     76             flag = 0;
     77         }
     78         if(flag) return true;
     79     }
     80     return false;
     81 }
     82 
     83 int main()
     84 {
     85     scanf("%d", &n);
     86     for(int i = 1; i <= n; i++) scanf("%d", &d[i]);
     87     int k;
     88     scanf("%d", &k);
     89     for(int i = 1; i <= k; i++) scanf("%d", &b[i]);
     90     int j = 1, now = 0;
     91     bool f = 1;
     92     for(int i = 1; i <= n; i++) {
     93         sum[j] += d[i];
     94         vec[j].push_back(i);
     95         if(check(j) == 0) {
     96             if(!solve(j)) {
     97                 f = 0; break;
     98             }
     99             j++;
    100         } else if(check(j) == 1) {
    101             f = 0;
    102             break;
    103         }
    104     }
    105     if(!f || j != k + 1) puts("NO");
    106     else {
    107         puts("YES");
    108         int sum = 0;
    109         for(int i = 1; i <= k; i++) { // 因为前面的被吃了,后面的要挤到前面去,所以减sum
    110             int sz = out[i].size();
    111             for(int j = 0; j < sz; j++) {
    112                 int x = out[i][j].first - sum, y = out[i][j].second;
    113                 printf("%d %c
    ", x, y == 0 ? 'L' : 'R');
    114             }
    115             sum += sz;
    116         }
    117     }
    118     return 0;
    119 }
  • 相关阅读:
    SpringBoot第五篇:整合Mybatis
    SpringBoot第四篇:整合JDBCTemplate
    SpringBoot第三篇:配置文件详解二
    分享一篇去年的项目总结
    Oracle生成多表触发器sql
    Oracle 设置用户密码永不过期
    Oracle建表提示SQL 错误: ORA-00904: : 标识符无效
    MySql数据备份
    ETL全量多表同步简述
    ETL全量单表同步简述
  • 原文地址:https://www.cnblogs.com/fightfordream/p/6020512.html
Copyright © 2011-2022 走看看