#用到了贪心方法。
#这个贪心刚开始想错了方法,后来想到了新的方法,AC
刚开始错在了按左端点升序排序并从左往右取最左端能取的格子,这个方法显然不能符合要求
比如下面这组数据:
2
1 1 3 3
1 1 3 3
2 2 2 2
错误代码:
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; struct note { int x1,x2,y1,y2,x,y; int num; } a[5010]; bool cmp1(note aa,note bb) { if(aa.x1!=bb.x1) return aa.x1<bb.x1; else return aa.x2<bb.x2; } bool cmp2(note aa,note bb) { if(aa.y1!=bb.y1) return aa.y1<bb.y1; else return aa.y2<bb.y2; } bool cmp3(note aa,note bb) { return aa.num<bb.num; } int main() { int n; while(scanf("%d",&n)!=EOF) { if(n==0) break; memset(a,0,sizeof(a)); for(int i=0; i<n; i++) { int a1,b1,a2,b2; scanf("%d%d%d%d",&a1,&b1,&a2,&b2); a[i].num=i; a[i].x1=a1; a[i].x2=a2; a[i].y1=b1; a[i].y2=b2; } int flag=1; sort(a,a+n,cmp1); for(int i=0; i<n; i++) { if(a[i].x1<=i+1&&a[i].x2>=i+1) a[i].x=i+1; else { flag=0; break; } } if(flag!=0) { sort(a,a+n,cmp2); for(int i=0; i<n; i++) { if(a[i].y1<=i+1&&a[i].y2>=i+1) a[i].y=i+1; else { flag=0; break; } } } if(flag==0) { printf("IMPOSSIBLE\n"); } else { sort(a,a+n,cmp3); for(int i=0; i<n; i++) { printf("%d %d\n",a[i].x,a[i].y); } } } return 0; }
后来换了方法,换成按右端点升序排序,从左往右取最左端能取的格子。这个方法用到了一个vis标记数组,不要忘记清零。
AC代码:
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; struct note { int x1,x2,y1,y2,x,y; int num; } a[5010]; int vis[5010]; bool cmp1(note aa,note bb) { if(aa.x2!=bb.x2) return aa.x2<bb.x2; else return aa.x1>bb.x1; } bool cmp2(note aa,note bb) { if(aa.y2!=bb.y2) return aa.y2<bb.y2; else return aa.y1>bb.y1; } bool cmp3(note aa,note bb) { return aa.num<bb.num; } int main() { int n; while(scanf("%d",&n)!=EOF) { if(n==0) break; memset(a,0,sizeof(a)); for(int i=0; i<n; i++) { int a1,b1,a2,b2; scanf("%d%d%d%d",&a1,&b1,&a2,&b2); a[i].num=i; a[i].x1=a1; a[i].x2=a2; a[i].y1=b1; a[i].y2=b2; } int flag=1; sort(a,a+n,cmp1); memset(vis,0,sizeof(vis)); for(int i=0; i<n; i++) { int temp1=a[i].x1; int temp2=a[i].x2; int flag1=0; for(int j=temp1; j<=temp2; j++) { if(!vis[j]) { a[i].x=j; flag1=1; vis[j]=1; break; } } if(!flag1) { flag=0; break; } } memset(vis,0,sizeof(vis)); if(flag!=0) { sort(a,a+n,cmp2); for(int i=0; i<n; i++) { int temp1=a[i].y1; int temp2=a[i].y2; int flag1=0; for(int j=temp1; j<=temp2; j++) { if(!vis[j]) { a[i].y=j; flag1=1; vis[j]=1; break; } } if(!flag1) { flag=0; break; } } } if(flag==0) { printf("IMPOSSIBLE\n"); } else { sort(a,a+n,cmp3); for(int i=0; i<n; i++) { printf("%d %d\n",a[i].x,a[i].y); } } } return 0; }
uva 11134 - Fabled Rooks(主要在贪心方法及其实现)
时间: 2024-11-25 23:41:51