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;
}

 

 

原文地址:https://www.cnblogs.com/163467wyj/p/12124967.html