|Tyvj|NOIP2008|貪心|P1007 排座椅
阿新 • • 發佈:2019-02-07
http://tyvj.cn/p/1007
貪心,先把每條路能解決問題的個數儲存,然後進行降序快排,然後每次貪心選擇一條能解決問題最多的一條路進行開闢,即選擇前k、l個數,然後再進行快排,因為輸出要按照升序輸出。
#include<cstdio> #include<cstring> int m,n,k,l,d; int a_k[1500], a_l[1500], k_n[1500], l_n[1500]; void qs(int* s, int* n, int l, int r) { int i=l, j=r, x=s[(l+r)/2]; do { while (s[i]>x) i++; while (s[j]<x) j--; if (i<=j) { int y = s[i]; s[i] = s[j]; s[j] = y; y = n[i]; n[i] = n[j]; n[j] = y; i++, j--; } } while (i<=j); if (i<r) qs(s,n,i,r); if (l<j) qs(s,n,l,j); } void init() { scanf("%d%d%d%d%d", &m,&n,&k,&l,&d); memset(a_k, 0,sizeof(a_k)); memset(a_l, 0,sizeof(a_l)); int xi,yi,pi,Qi; for (int i=1;i<=d;i++) { scanf("%d%d%d%d", &xi,&yi,&pi,&Qi); if (yi-Qi==1) a_l[Qi]++; if (Qi-yi==1) a_l[yi]++; if (xi-pi==1) a_k[pi]++; if (pi-xi==1) a_k[xi]++; } for (int i=1;i<=m-1;i++) { k_n[i]=i; } for (int i=1;i<=n-1;i++) { l_n[i]=i; } qs(a_k, k_n, 1, m-1), qs(a_l, l_n, 1, n-1); qs(k_n, a_k, 1, k); qs(l_n, a_l, 1, l); for (int i=k;i>=1;i--) printf("%d ", k_n[i]); putchar('\n'); for (int i=l;i>=1;i--) printf("%d ", l_n[i]); } void go() { } int main() { init(); go(); return 0; }