输入文件:ppairing.in
输出文件:ppairing.out
时间限制:1 s 内存限制:128 MB
作为生日礼物,BESSIE得到了N (2 <= N <= 100,000;N%2 == 0)颗珍珠, 每颗珍珠的颜色为C种颜色之一 (1 <= C <= N).
BESSIE发现N是一个偶数,她想把所有珍珠分成N/2对,使得每对的两颗珍珠的颜色都不同.
BESSIE知道这样一个分配在给定数据里都是可能的,请帮助她找到这样一个分配. 如果有多个解,任意一个,输出任意一个.
题名: ppairing
输入格式:
- 第1行: 两个数, N 和 C
- 第 2..C + 1 行: 第i+1行含有一个数,C_i, 颜色为i的珍珠的数目.
样例输入 (ppairing.in):
8 3 2 2 4
输入解释:
共8颗珍珠,2颗为颜色I,2颗为颜色II,4颗为颜色III.
输出格式:
- 第 1..N/2行: 第i行包含两个数a_i和b_i. 对应于一对颜色分别为a_i和b_i的珍珠.
样例输出 (ppairing.out):
1 3 1 3 2 3 3 2
输出解释:
BESSIE把每颗颜色为III的珍珠和一颗颜色为I/II的组成一对.
据说这是USACO金组的题......
解;
期望:100 实际:100
将每种颜色个数从大到小排序之后,将颜色分配到各个位置
然后让 i 与i +n/2 分为一组即可
先匹配多的一定是最优的呀。

1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<queue> 5 #include<map> 6 #include<cstring> 7 #include<string> 8 using namespace std; 9 inline int read() 10 { 11 int x=0,w=1;char ch=getchar(); 12 while(!isdigit(ch)){if(ch==‘-‘) w=-1;ch=getchar();} 13 while(isdigit(ch)) x=(x<<3)+(x<<1)+ch-‘0‘,ch=getchar(); 14 return x*w; 15 } 16 const int N=100000+10; 17 int n,m,l,col[N]; 18 struct node{ 19 int col,x; 20 }e[N]; 21 bool cmp(node k,node y){return k.x>y.x;} 22 int main() 23 { 24 freopen("ppairing.in","r",stdin); 25 freopen("ppairing.out","w",stdout); 26 n=read();m=read(); 27 for(int i=1;i<=m;++i) 28 e[i].col=i,e[i].x=read(); 29 sort(e+1,e+m+1,cmp); 30 for(int i=1;i<=m;++i) 31 for(int j=1;j<=e[i].x;++j) 32 col[++l]=e[i].col; 33 for(int i=1;i<=l/2;++i) 34 cout<<col[i]<<" "<<col[i+l/2]<<endl; 35 return 0; 36 }