洛谷P1056:排座椅(貪心)
阿新 • • 發佈:2018-12-20
https://www.luogu.org/problemnew/show/P1056
輸入輸出樣例
輸入樣例#1: 複製
4 5 1 2 3 4 2 4 3 2 3 3 3 2 5 2 4
輸出樣例#1: 複製
2 2 4
說明
上圖中用符號*、※、+標出了333對會交頭接耳的學生的位置,圖中333條粗線的位置表示通道,圖示的通道劃分方案是唯一的最佳方案。
只要兩個人之間滿足條件就可以在中間加一條道路出來,選出其中能夠隔開最多人的道路的 l 條和k 條,再把他們按下標從小到大輸出。
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; #define N 2020 struct data { int fr; int x; }a[N],b[N]; int cmp(data a , data b) { return a.fr > b.fr; } int tk(data a , data b) { return a.x < b.x; } int main() { int m,n,k,l,d,x1,y1,x2,y2,i; scanf("%d%d%d%d%d", &m, &n, &k, &l, &d); for(i = 1; i <= m; i ++) { b[i].fr=0; b[i].x=i; } for( i = 1; i <= n; i ++) { a[i].fr=0; a[i].x=i; } while(d--) { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); if(x1 == x2) b[min( y1, y2 )].fr++;; if(y1 == y2) a[min( x1,x2 )].fr++; } sort(a+1, a+n+1, cmp); sort(a+1, a+k+1, tk); if(k) printf("%d", a[1].x); for(i=2;i<=k;i++) printf(" %d", a[i].x); printf("\n"); sort(b+1, b+m+1, cmp); sort(b+1, b+l+1, tk); if(l) printf("%d", b[1].x); for(i=2;i<=l;i++) printf(" %d", b[i].x); printf("\n"); return 0; }