poj 1201 Intervals
2015-11-25 16:36
239 查看
描述
You are given n closed, integer intervals [ai, bi] and n integers c1, …, cn.
Write a program that:
reads the number of intervals, their end points and integers c1, …, cn from the standard input,
computes the minimal size of a set Z of integers which has at least ci common elements with interval [ai, bi], for each i=1,2,…,n,
writes the answer to the standard output.
输入
The first line of the input contains an integer n (1 <= n <= 50000) – the number of intervals. The following n lines describe the intervals. The (i+1)-th line of the input contains three integers ai, bi and ci separated by single spaces and such that 0 <= ai <= bi <= 50000 and 1 <= ci <= bi - ai+1.
输出
The output contains exactly one integer equal to the minimal size of set Z sharing at least ci elements with interval [ai, bi], for each i=1,2,…,n.
题目大意:
有一个序列,题目用n个整数组合[ai,bi,ci]来描述它,[ai,bi,ci]表示在该序列中处于[ai,bi]这个区间的整数至少有ci个。如果存在这样的序列,请求出满足题目要求的最短的序列长度是多少。如果不存在则输出 -1。
输入:第一行包括一个整数n,表示区间个数,以下n行每行描述这些区间,第i+1行三个整数ai,bi,ci,由空格隔开,其中0<=ai<=bi<=50000 而且1<=ci<=bi-ai+1。
输出:一行,输出满足要求的序列的长度的最小值。
思路:
这是一道差分约束,约束方程为:
sum[bi]-sum[ai-1]>=ci,sum[i]-sum[i-1]>=0,sum[i-1]-sum[i]>=-1;(sum[i]表示从0到i满足要求的数)
You are given n closed, integer intervals [ai, bi] and n integers c1, …, cn.
Write a program that:
reads the number of intervals, their end points and integers c1, …, cn from the standard input,
computes the minimal size of a set Z of integers which has at least ci common elements with interval [ai, bi], for each i=1,2,…,n,
writes the answer to the standard output.
输入
The first line of the input contains an integer n (1 <= n <= 50000) – the number of intervals. The following n lines describe the intervals. The (i+1)-th line of the input contains three integers ai, bi and ci separated by single spaces and such that 0 <= ai <= bi <= 50000 and 1 <= ci <= bi - ai+1.
输出
The output contains exactly one integer equal to the minimal size of set Z sharing at least ci elements with interval [ai, bi], for each i=1,2,…,n.
题目大意:
有一个序列,题目用n个整数组合[ai,bi,ci]来描述它,[ai,bi,ci]表示在该序列中处于[ai,bi]这个区间的整数至少有ci个。如果存在这样的序列,请求出满足题目要求的最短的序列长度是多少。如果不存在则输出 -1。
输入:第一行包括一个整数n,表示区间个数,以下n行每行描述这些区间,第i+1行三个整数ai,bi,ci,由空格隔开,其中0<=ai<=bi<=50000 而且1<=ci<=bi-ai+1。
输出:一行,输出满足要求的序列的长度的最小值。
思路:
这是一道差分约束,约束方程为:
sum[bi]-sum[ai-1]>=ci,sum[i]-sum[i-1]>=0,sum[i-1]-sum[i]>=-1;(sum[i]表示从0到i满足要求的数)
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<algorithm> using namespace std; #define inf 0x7f7f7f7f struct node { int next,en,len; }E[600000]; int head[50005],dis[50005],num,n;bool vis[50005]; void init() { num=0; memset(head,-1,sizeof(head)); } void add(int st,int en,int len) { E[num].en=en;E[num].len=len; E[num].next=head[st];head[st]=num++; } void spfa(int st,int en) { int i; for(i=0;i<=en;i++) { dis[i]=-inf; vis[i]=false; } queue<int>q; dis[st]=0;vis[st]=true; q.push(st); while(!q.empty()) { int x=q.front(); q.pop();vis[x]=false; for(i=head[x];i!=-1;i=E[i].next) { int v=E[i].en; if(dis[v]<dis[x]+E[i].len) { dis[v]=dis[x]+E[i].len; if(!vis[v]) { vis[v]=true; q.push(v); } } } } } int main() { int i,a,b,c,st,en; while(scanf("%d",&n)!=EOF) { init();st=inf,en=-inf; while(n--) { scanf("%d%d%d",&a,&b,&c); a++,b++;//防止起点为负数 st=min(st,a-1); en=max(en,b); add(a-1,b,c); } for(i=st;i<=en;i++) { add(i-1,i,0); add(i,i-1,-1); } spfa(st,en); int ans=dis[en]; printf("%d\n",ans); } return 0; }
相关文章推荐
- 1076. Forwards on Weibo
- VB.NET 用循环判断文本框是否为空
- 1074. Reversing Linked List
- 移动开发 反劫持
- 关于一些动画和特效的收集,碰到了就收集
- Legolas工业自动化平台案例 —— 水源地自动化监控系统
- iOS开发多线程-GCD的常见用法
- 走进Java(五)JSTL和EL表达式
- Android动画之属性动画(二)
- ajax接口之一:登录退出系统
- Activty启动通过Action练习
- oracle存储过程、声明变量、for循环
- android编译分析之9—dumpvar.mk
- C# 微信扫码支付 回调页面
- IIS上部署网站404错误
- ajax文件下载
- Spring MVC 接收Json格式参数
- 程序员不可不知的英文词汇(5)
- setVisibility()设置过度动画
- 【codevs1028】花店橱窗布置 费用流(EK)