• 【codeforces 724E】Goods transportation


    【题目链接】:http://codeforces.com/problemset/problem/724/E

    【题意】

    有n个城市;
    这个些城市每个城市有pi单位的物品;
    然后已知每个城市能卖掉si单位单位的物品;
    且每个城市i能向城市j最多运送c单位的物品(这里j严格大于i);
    问你最多能在这n个城市里面卖掉多少单位的物品;

    【题解】

    可以转化为最大流模型;
    虚拟一个起点s和源点t;
    在s和n个城市之间分别建n条边pi;
    在n个城市和t之间分别建n条边si;
    在n个城市之间(x,y)建n*(n-1)/2条边;这里(x< y)
    然后从起点跑最大流就能得到答案;
    因为n很大;
    不能单纯地跑最大流;
    根据最大流=最小割;
    写个DP吧
    每个点最后,肯定是只和s连、或者是和t连;
    不可能说两条边都删掉;
    则对于每个点,看他删掉的是哪条边;

    /*
        设f[i][j]表示前i个城市中,有j个城市和起点s相连的最小割;
        则
        f[i][j] = min(f[i-1][j-1]+s[i],f[i-1][j]+p[i]+j*c);
                     (删掉i和t的边,删掉i和起点s的边);
                                    因为和起点s相连的点,可以从s到那个点
                                    然后再到点i再到终点t,所以要多加上j*c;
                                    即把那j条边删掉
        f[i][0] = f[i-1][0]+p[i];//不能连i和s边了,即只能删掉i和s边了
        f[i][i] = f[i-1][i-1]+s[i];//不能删i和s边了,即只能删掉i和t边了
    */


    【Number Of WA

    0

    【完整代码】

    #include <bits/stdc++.h>
    using namespace std;
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define LL long long
    #define rep1(i,a,b) for (int i = a;i <= b;i++)
    #define rep2(i,a,b) for (int i = a;i >= b;i--)
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define ms(x,y) memset(x,y,sizeof x)
    
    typedef pair<int,int> pii;
    typedef pair<LL,LL> pll;
    
    const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
    const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
    const double pi = acos(-1.0);
    const int N = 1e4+100;
    
    LL f[2][N],p[N],s[N],c;
    int n,now,pre;
    
    int main()
    {
        //freopen("F:\\rush.txt","r",stdin);
        ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf not use
        cin >> n >> c;
        rep1(i,1,n) cin >> p[i];
        rep1(i,1,n) cin >> s[i];
        rep1(i,1,n)
        {
            now = now^1;
            f[now][0] = f[now^1][0]+p[i];
            rep1(j,1,i-1)
                f[now][j] = min(f[now^1][j-1]+s[i],f[now^1][j]+p[i]+j*c);
            f[now][i] = f[now^1][i-1]+s[i];
        }
        LL ans = f[now][0];
        rep1(i,1,n)
            ans = min(ans,f[now][i]);
        cout << ans << endl;
        return 0;
    }
  • 相关阅读:
    1230: [Usaco2008 Nov]lites 开关灯
    1821: [JSOI2010]Group 部落划分 Group
    1819: [JSOI]Word Query电子字典
    1820: [JSOI2010]Express Service 快递服务
    3038: 上帝造题的七分钟2
    1854: [Scoi2010]游戏
    Codevs3278[NOIP2013]货车运输
    关于使用lazytag的线段树两种查询方式的比较研究
    算法模板——splay区间反转 1
    3223: Tyvj 1729 文艺平衡树
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626331.html
Copyright © 2020-2023  润新知