码迷,mamicode.com
首页 > 其他好文 > 详细

[USACO Mar08] 珍珠分对

时间:2018-03-07 21:52:11      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:blog   sed   out   line   while   sdi   不同   success   opened   

输入文件: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 }
安然流香

 

[USACO Mar08] 珍珠分对

标签:blog   sed   out   line   while   sdi   不同   success   opened   

原文地址:https://www.cnblogs.com/adelalove/p/8525153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!