Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 7404 | Accepted: 2991 |
Description
Write a program that: finds the minimal number of elements in a set containing at least two different integers from each interval.
Input
Output
Sample Input
4 3 6 2 4 0 2 4 7
Sample Output
4
Source
贪心能过,不过我还是用了差分约束系统,也就是SPFA
1201的简化版
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int E=10005;
const int V=10005;
const int INF=1<<25-1;
struct EDGE
{
int link,val,next;
}edge[E*3];
int head[V],dist[V],e,rmin,rmax;
bool vis[V];
void addedge(int a,int b,int c)
{
edge[e].link=b;
edge[e].val=c;
edge[e].next=head[a];
head[a]=e++;
}
int relax(int u,int v,int c)
{
if(dist[v]<dist[u]+c)//不能是<=,会死循环
{
dist[v]=dist[u]+c;
return 1;
}
return 0;
}
void SPFA(int src)
{
memset(vis,false,sizeof(vis));
for(int i=rmin;i<=rmax;i++) dist[i]=-INF;
int top=1;
dist[src]=0;
vis[src]=true;
queue<int> q;
q.push(src);
while(!q.empty())
{
int u,v;
u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=edge[i].next)
{
v=edge[i].link;
if(relax(u,v,edge[i].val)==1&&!vis[v])
{
q.push(v);
vis[v]=true;
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
e=0;
memset(head,-1,sizeof(head));
rmin=1<<25-1; rmax=-1;
for(int i=1;i<=n;i++)
{
int a,b,c;
scanf("%d%d",&a,&b);
if(a<rmin) rmin=a;
if(b+1>rmax) rmax=b+1;
addedge(a,b+1,2);
}
for(int i=rmin;i<rmax;i++) addedge(i,i+1,0);
for(int i=rmin;i<rmax;i++) addedge(i+1,i,-1);
SPFA(rmin);
printf("%d/n",dist[rmax]-dist[rmin]);
}
return 0;
}