洛谷P2902 [USACO08MAR]珍珠配对Pearl Pairing

一、算法分析

这道题要注意学会进行深入分析,在进行分析之前首先一定要搞清楚题目到底是要我们算什么。题目显然是希望我们输出配对方案,合法的配对方案是只要两个珍珠颜色不相同就行,也就是说,只要同一行的两个数字不相同就行,此外还需要刚好用掉所有的珍珠。这时就需要我们进行深入的思考了。首先要想让珍珠不重色,我们就要考虑,什么情况下珍珠会重色。显然,当某一种颜色的珍珠数量超过了所有珍珠数量的一半时,就永远无法成功配对所有珍珠,因为总是会至少有一对珍珠是相同颜色的。此外我们发现,在题目输入的过程中,珍珠的颜色是有序的,也就是说题目中的珍珠颜色输入是从颜色1开始,一直到颜色m,相同颜色的珠子是一起输入进去的,就像会存在11122233444这样的情况,但是绝对不可能出现11122331133这样的乱序。因而如果有一种颜色的珍珠过了半数,那么这种颜色的珍珠仍然是聚在一起的,但是题目显然没有给出非法数据。这就启示我们,只要选择将第i个珍珠和第i+n/2个珍珠配对,那么在最坏情况下两个珍珠都不会是一个颜色,比如序列11112222用第一个和第五个配对,第二个和第六个配对依此类推即可。所以我们就找出了配对的方法了。代码如下

二、代码及注释

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100050;
int n,m;
int len=0;
int a[maxn];
int main(){
	
	
	cin>>n>>m;
	int x;
	for(int i=1;i<=m;i++){
		cin>>x;
		for(int j=0;j<x;j++) a[++len]=i;                                    //将各个珠子都存下 
	}
	for(int i=1;i<=n/2;i++) cout<<a[i]<<' '<<a[i+n/2]<<endl;
	return 0;
	
} 
发布了50 篇原创文章 · 获赞 7 · 访问量 1126

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103747423