【题目链接】: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;
}