Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
用了差分约束,但是老WA检查不出为什么了。大牛帮看一下,谢谢!不知道是不是题目理解错了。 示例输出是: 19 -5 -4 -3 -2 -1 0 4 5 6 7 8 15 18 19 20 21 25 26 27 我的输出是: 19 -5 -4 -3 -2 -1 0 4 5 6 7 8 14 15 19 20 21 25 26 27 差别在于14和18。 按我对题意的理解来看,应该两种答案都是可以的。 代码如下: #include <stdio.h> #define INF (1<<30) struct Edges { int b; int e; }; int pathpath[20002]; #define MAX 10000 int min,max; int n,k; Edges e[1000]; Edges es[1000]; int elen; int eslen; void bellman_ford() { int i,j; int nv=max-min+1; int *path=pathpath+MAX; for(i=min;i<=max;i++) path[i]=0; bool over; for(i=1;i<nv;i++) { over=true; //区间内至少要有k个广告的 for(j=0;j<elen;j++) { if(path[e[j].e]<path[e[j].b]+k) { over=false; path[e[j].e]=path[e[j].b]+k; } } //区间内每个板上都放广告 for(j=0;j<eslen;j++) { int temp; for(temp=es[j].b-1;temp<es[j].e;temp++) { //要求x[temp+1]>=x[temp]+1 if(path[temp+1]<path[temp]+1) { over=false; path[temp+1]=path[temp]+1; } } } for(j=min;j<max;j++) { //要求x[j+1]>=x[j] if(path[j]>path[j+1]) { path[j+1]=path[j]; over=false; } } for(j=max;j>min;j--) { //要求x[j]<=x[j-1]+1 if(path[j]-1>path[j-1]) { path[j-1]=path[j]-1; over=false; } } if(over) break; } printf("%d\n",path[max]); for(i=min;i<max;i++) { if(path[i+1]-path[i]==1) { printf("%d\n",i); } } } int main() { scanf("%d%d",&k,&n); min=10000; max=-10000; int i,a,b; elen=0; eslen=0; int swaptemp; for(i=0;i<n;i++) { scanf("%d%d",&a,&b); if(a>b) { swaptemp=a; a=b; b=swaptemp; } //分成两种边 if(b-a+1<k) { //一种是区间大小小于k的 //需要在区间内的每个板上都放广告 es[eslen].b=a; es[eslen].e=b+1; eslen++; } else { //另一种则是在区间内至少有k个广告就可以了 e[elen].b=a; e[elen].e=b+1; elen++; } if(min>a) min=a; if(max<b+1) max=b+1; } bellman_ford(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator