COGS132珍珠分对|优先队列
2015-10-11 21:15
666 查看
题意:
作为生日礼物,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颗珍珠,2颗为颜色I,2颗为颜色II,4颗为颜色III.
输出格式:
第 1..N/2行: 第i行包含两个数a_i和b_i. 对应于一对颜色分别为a_i和b_i的珍珠.
样例输出 (ppairing.out):
输出解释:
BESSIE把每颗颜色为III的珍珠和一颗颜色为I/II的组成一对.
优先队列维护过程即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int MAXN=100010;
int n,c,tot;
struct BEAD{
int sum,col;
bool friend operator <(BEAD a,BEAD b) {
return a.sum<b.sum;
}
}a[MAXN];
priority_queue<BEAD> q;
void init(){
int i;
scanf("%d%d",&n,&c);
for(i=1;i<=c;++i) {
scanf("%d",&a[i].sum);
a[i].col=i;
tot+=a[i].sum;
}
for(i=1;i<=c;++i) q.push(a[i]);
for(i=1;i<=tot/2;++i) {
BEAD e=q.top();q.pop();
BEAD x=q.top();q.pop();
printf("%d %d\n",e.col,x.col);
e.sum--;
x.sum--;
if(e.sum)q.push(e);
if(x.sum)q.push(x);
}
}
int main(){
freopen("ppairing.in","r",stdin);
freopen("ppairing.out","w",stdout);
init();
}
作为生日礼物,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的组成一对.
优先队列维护过程即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int MAXN=100010;
int n,c,tot;
struct BEAD{
int sum,col;
bool friend operator <(BEAD a,BEAD b) {
return a.sum<b.sum;
}
}a[MAXN];
priority_queue<BEAD> q;
void init(){
int i;
scanf("%d%d",&n,&c);
for(i=1;i<=c;++i) {
scanf("%d",&a[i].sum);
a[i].col=i;
tot+=a[i].sum;
}
for(i=1;i<=c;++i) q.push(a[i]);
for(i=1;i<=tot/2;++i) {
BEAD e=q.top();q.pop();
BEAD x=q.top();q.pop();
printf("%d %d\n",e.col,x.col);
e.sum--;
x.sum--;
if(e.sum)q.push(e);
if(x.sum)q.push(x);
}
}
int main(){
freopen("ppairing.in","r",stdin);
freopen("ppairing.out","w",stdout);
init();
}
相关文章推荐
- POJ1979 Red and Black 题解
- HDOJ 1001 递归方法
- AcceptCM Contest - 1 题解
- HDU 1203 I NEED A OFFER! 题解
- UVA 401 Palindromes 题解
- UVA 10010 - Where's Waldorf? 题解
- 【题解】洛谷1164小A点菜
- 杭电试题分类题解
- hdoj1017--A Mathematical Curiosity
- hdoj1020--Encoding
- hdoj1002--A + B Problem II
- poj2312题解
- 【bzoj1033】杀蚂蚁
- 【bzoj2548】灭鼠行动解题报告
- Noip 2014 提高组复赛 解题报告
- HEU日常训练10.02
- HDU 1159
- HDU 1046
- 题解053-425(V13.02版本,711题)
- 题解053-427(V13.02版本,711题)