题意:

给定每个兵营的最大容量,以及第i到第j个兵营至少有多少个士兵,问所有兵营一共至少有多少个士兵?

分析:

差分约束系统,注意

  • 第i到第j至少有k个
  • 第i到第j最多有最大容量之和个
  • 每个兵营至少有0个
  • 每个兵营最多有最大容量个

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
#define mem(s,a) memset(s, a, sizeof(s))
typedef long long ll;
const int maxm = 25005, maxn = 1005;
#define INF 0x3ffffffff
struct edge{int u,v;ll w;};
edge e[maxm];
int c[maxn];
long long d[maxn];
int m, n, tot;
bool bellford()
{
fill(d,d+n+1,INF);
d[n] = 0;
for(int i = 0; i < n + 1; i++){
for(int j = 0; j < tot; j++){
int u1= e[j].u, v1 = e[j].v;
if(d[u1]!=INF&&d[v1]-d[u1]>e[j].w){
d[v1] = d[u1] + e[j].w;
if(i == n) return false;
}
}
}
return true;
}
int main (void)
{
int t;
while(~scanf("%d%d",&n, &m)){
mem(c,0);
for(int i = 1; i <= n; i++){
scanf("%d",&t);
c[i] = c[i-1] +t;
}
int i, j, k;
tot = 0;
for(int a = 0; a < m; a++){
scanf("%d%d%d",&i,&j,&k);
e[tot++] = (edge){j, i-1, -k};
e[tot++] = (edge){i-1, j, c[j]-c[i-1]};
}
for(int b= 0; b < n; b++){
e[tot++] = (edge){b, b + 1, c[b + 1] - c[b]};
e[tot++] = (edge){b+1, b, 0};
} if(bellford()) printf("%I64d\n",d[n]-d[0]);
else printf("Bad Estimations\n"); }
return 0;
}

之前一直怕k会很大,就用了long long,可是INF忘记改,一直PE,后来改了INF,AC,改成int,AC,可是到现在也不明白为什么是PE而不是WA。

先放着再想想吧。

最新文章

  1. C#使用GET、POST请求获取结果
  2. Java数据结构之对称矩阵的压缩算法---
  3. 开启关闭keditor 过滤
  4. hive中分号问题
  5. buffer正确的拼接方式
  6. 磨刀不误砍柴工,使用visual studio之前应该先了解这些...
  7. C#实现自动升级(附源码)
  8. Mysql or Mongodb LBS快速实现方案
  9. nodejs爬虫
  10. Eclipse 文本显示行号
  11. hive数据导入方法
  12. 关于.jar的文件在cmd中无法连接数据库的问题
  13. CSS常见问题及兼容性
  14. 写一个最简单的 Server
  15. Java获取本机MAC地址
  16. ♫【JS基础】壹零零壹
  17. poj2406 Power Strings(kmp失配函数)
  18. html进阶css(3)
  19. c语言 inline函数
  20. pattern

热门文章

  1. XML读取的小例子
  2. 阿里云OSS搭建移动应用直传服务的.Net C#示例
  3. 升级 Cocoapods 到1.2.0指定版本,降低版本及卸载
  4. oracle 时间格式转化以及计算
  5. mac 下使用gcc 编译c函数
  6. spring 中文乱码问题
  7. SQL——连接查询、聚合函数、开窗函数、分组功能、联合查询、子查询
  8. (转)淘淘商城系列——KindEditor富文本编辑器的使用
  9. Mysql,Oracle使用rollup函数完成行列统计
  10. 2018 CCPC 桂林站(upc复现赛)补题