zoukankan      html  css  js  c++  java
  • Codeforces Round #608 (Div. 2)

    传送门


    A Suits standard input/output 1 s, 256 MB Submit Add to favourites x7772

      如题意,模拟
    B Blocks standard input/output 2 s, 256 MB Submit Add to favourites x5220

      给你一个 n 长度的 BW 字符串, 问是否能在 3n 次翻转内将字符串变成全 B 或者 全 W, (翻转的话是 相邻的两个字符都翻一下 B-W 或者 W-B), 做法是以白色为标准 从前到后跑一遍   如果是黑色字符就翻转下这个字符和后面的字符, 跑完一遍后 如果还没有变成全白 , 那就再以黑色为标准跑一遍  如果还不能变成全B 或 W 串  那便无解。
    C Shawarma Tent standard input/output 1 s, 256 MB Submit Add to favourites x5079

      给你一个学校的地址x0 y0, 还有 n 个学生的家庭地址,  问将一个帐篷建在哪里  能够有最多学生经过(学生到学校只能走最短的dx+dy), 当时写的时候画了个图 以学校地址为中心,猜了一波  发现可以分别用 x=x0 和 y= y0 将平面划分成两个区域, 如果在哪个区域的学生坐标点最多 那帐篷就得建在这条路上为最优  至于帐篷坐标点就为学校地址往那个区域-1即可。enmmm 过了, 结束以后 看题解 大致如此。
    D Portals standard input/output 2 s, 256 MB Submit Add to favourites x978

      enmmmmm题意confused, 结束以后看了题解 再看了一遍题目 大概懂了, 给你 n 个城堡 必须按顺序攻陷, 每个城堡有攻陷需要的最少士兵数量要求 和 攻下来以后能够增加的士兵数量 还有占领这座城堡能得到的收益, 有 m 个portal u-> v  在城堡 u 通过portal可以派兵去城堡v ,  至于占领城堡只需要一个士兵即可, portal只有在当前城堡u时才可以用, 也就是说每个城堡需要进行一次决策, 求最大的收益, 然后题解用的是二维dp  dp[i][j] 表示身处 i 城堡且有 j 个士兵, 转移方程为 

      if(dp[i][j] >= 0)  dp[i+1][j+b[i]] = max(dp[i][j], dp[i+1][j+b[i]]);

      如果 i 能派兵到 j    dp[i+1][k-1] = max(dp[i+1][k]+c[j], dp[i+1][k-1]); 

      至于poral 初始化所有城堡为i 表示都能驻兵自己,只需要记录最大的编号能到 i 的城堡,
      最后求下最大的 dp[n][i] 即可, 代码如下


    E Common Number standard input/output 2 s, 256 MB Submit Add to favourites x1312
    F Divide The Students standard input/output 8 s, 512 MB Submit Add to favourites x56

    #include<bits/stdc++.h>//Codeforces Round #608 (Div. 2)
    using namespace std;
    
    #define _for(i,a,b) for(int i = (a); i < (b); i++)
    #define _rep(i,a,b) for(int i = (a); i <= (b); i++)
    #define _per(i,a,b) for(int i = (a); i > (b); i--)
    #define ll long long
    void taskA(){
        int t; 
        t = 1;
        while(t--) {
            int a,b,c,d,e,f, ans = 0;
            cin >> a >> b >> c >> d >> e >> f;
            if(e < f) {
                int x = min(b, min(c, d));
                b -= x, c -= x, d-=x;
                ans += f*x;
                x = min(a, d); if(x < 0) x = 0;
                ans += e*x;
            }else {
                int x = min(a, d);
                a -= x, d-=x;
                ans += e*x;
                x = min(b, min(c, d)); 
                b -= x, c -= x, d-=x; if(x < 0) x = 0;
                ans += f*x;
            }
            cout << ans  << '
    ';
        }return;
    }
    void taskB(){
        int n; cin >> n;
        string s; cin >> s;
        int w = 0, b = 0;
        vector<int> v(n);
        for(auto &c : s) {
            if(c == 'W') w++, c = 0;
            else b++, c = 1; 
        }
        if(!w || !b) cout << "0
    ";
        else if(n%2==0 && b%2==1) cout << "-1
    ";
        else{
            vector<int> ans;
            _for(x,0,2) {
                _for(i,0,n) {
                    if(s[i]==x || i==n-1) continue;
                    ans.push_back(i);
                    s[i] ^= 1, s[i+1]^=1;
                }
                if(x == s[n-1]) {
                        cout << ans.size() << '
    ';
                        //sort(v.begin(), v.end());
                        for(int x1 : ans) cout << x1+1 << " ";
                        cout << '
    ';
                        return;
                }
            } 
        }return;
    }
    void taskC(){
        int n; cin >> n; int x0,y0; cin>> x0 >> y0;
        vector<int> x(n), y(n);
        int x1 = 0, x2 = 0, y1 = 0,y2 = 0;
        _for(i,0,n) {
            cin >> x[i] >> y[i];
            if(x[i] > x0) x1++;
            else if(x[i] < x0) x2++;
            if(y[i] > y0) y1++;
            else if(y[i] <  y0) y2++;
        }
        int ma = max(x1, max(x2, max(y1, y2)));
        if(ma == x1) cout << x1 << '
    ' << x0+1 << ' ' << y0;
        else if(ma == x2) cout << x2 << '
    ' << x0-1 << ' ' << y0;
        else if(ma == y2) cout << y2 << '
    ' << x0 << ' ' << y0-1;
        else if(ma == y1) cout << y1 << '
    ' << x0 << ' ' << y0+1;
        return;
    }
    void taskC1(){
        int n; cin >> n; int x0,y0; cin >> x0 >> y0;
        int dx[] = {0,0,-1,1}, dy[] = {-1,1,0,0}, d[5] = {};
        _for(i,0,n) {
            int x,y; cin >> x >> y;
            _for(j,0,4) {
                int x1 = x0+dx[j], y1 = y0+dy[j];
                if(abs(x-x1)+abs(y-y1)+abs(x1-x0)+abs(y1-y0) == abs(x-x0)+abs(y-y0)) d[j]++;
            }
        }
        int gol = 0;
        _for(i,1,4) if(d[i] > d[gol]) gol = i;
    
        cout << d[gol] << '
    ';
        cout << x0+dx[gol] << " " << y0+dy[gol] << '
    ';
        return;
    }
    int dp[5005][5005];
    void taskD(){
        int n,m,K;
        cin >> n >> m >> K;
        vector<int> a(n), b(n), c(n);
        ll sum = 0;
    
        vector<int> latest(n);
        _for(i,0,n) cin >> a[i] >> b[i] >> c[i], latest[i] = i;
        
        _for(i,0,m) {
            int x,y; cin >> x >> y;
            x--, y--; latest[y] = max(latest[y], x);
        }
        _for(i,0,5005) _for(j,0,5005) dp[i][j] = -1e9;
    
        dp[0][K] = 0;
        _for(i,0,n) {
            _for(j,a[i],5005) {
                if(dp[i][j] >= 0) 
                    dp[i+1][j+b[i]] = max(dp[i][j], dp[i+1][j+b[i]]);
            }
    
            _rep(j,0,i) {
                if(latest[j] == i)
                    _for(k,1,5005) if(dp[i+1][k] >= 0)
                        dp[i+1][k-1] = max(dp[i+1][k]+c[j], dp[i+1][k-1]);
            }
        }
    
        int ans = -1;
        _for(i,0,5005) ans = max(ans, dp[n][i]);
        cout << ans << '
    ';
        return;
    }
    int main(){
        ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
        //freopen("output.txt", "w", stdout);
        //taskA();
        //taskB();
        //taskC();
        taskD();
        return 0;
    }

     

     

  • 相关阅读:
    sql中not exists的用法
    jsp中target="_blank"的用法
    jsp 运用 session 登录输出
    jsp留言板
    编写JSP 实现用户登录并判断用户或密码
    jsp打印九九乘法表
    jsp输出当前时间
    jsp输出金字塔
    jsp输出5的阶乘
    jdbc练习3
  • 原文地址:https://www.cnblogs.com/163467wyj/p/12124967.html
Copyright © 2011-2022 走看看