题目大意:输入n个区间,每个区间有3个值,ai,bi,ci代表在区间[ai,bi]上至少要有ci个整数点,现在要满足所有区间的自身条件,问最少选多少个点。
类似zoj 2770可以建模成一个差分约束系统.
#include <stdio.h> #include <string.h> int n,dist[50010]; struct e { int u,v,w; }edges[50010]; int mn,mx; bool bellman() { int i,t; int f=1; while(f) { f=0; for(i=0;i<n;i++) { t=dist[edges[i].u]+edges[i].w; if(dist[edges[i].v]>t) { dist[edges[i].v]=t; f=1; } } for(i=mn;i<=mx;i++) { t=dist[i-1]+1; if(dist[i]>t) { dist[i]=t; f=1; } } for(i=mx;i>=mn;i--) { t=dist[i]; if(dist[i-1]>t) { dist[i-1]=t; f=1; } } } return true; } int main() { int i,u,v,w; while(scanf("%d",&n)!=EOF) { memset(dist,0,sizeof(dist)); mx=1; mn=99999; for(i=0;i<n;i++) { scanf("%d%d%d",&u,&v,&w); edges[i].u=v; edges[i].v=u-1; edges[i].w=-w; if(mn>u) mn=u; if(mx<v) mx=v; } bellman(); printf("%d ",dist[mx]-dist[mn-1]); } return 0; }