C. Beautiful Lyrics(模拟)

C. Beautiful Lyrics

(1)思路:

将n个字符串分为两类,

末尾元音数量相同,并且末尾元音一样的分为一类;数量即为t1

否则末尾元音数量相同的分为一类;数量即为t2

如果t1大于t2,就将t1后面多出来的放到t2后面。

这里需要平均分配(当时可能是这里写错了,所以一直出错)。

(2)代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn = 1e5+10;
string ss[maxn];
int vis[maxn]={0};
struct Node{
	int id,num;
	char ch;
}cur[maxn];
vector <Node> vc;
struct node{
	int p1,p2;
};
node v1[maxn],v2[maxn];
bool cmp(Node a,Node b){
	if(a.num!=b.num) return a.num<b.num;
	return a.ch<b.ch;
}
int MIN(int x,int y){
	return x<y?x:y;
}
int main(void){
	int n;cin>>n;
	for(int i=1;i<=n;i++){
		cin>>ss[i];
		cur[i].id = i;
		cur[i].num = 0;
		int len = ss[i].length();
		for(int j=0;j<len;j++)
			if(ss[i][j]=='a'||ss[i][j]=='e'||ss[i][j]=='i'||ss[i][j]=='o'||ss[i][j]=='u'){
				cur[i].num++;cur[i].ch = ss[i][j];
			}
	}
	sort(cur+1,cur+1+n,cmp);
	int t1 = 0,t2 = 0;
	vc.clear();
	for(int i=2;i<=n;i++)
	if(vis[i]==0&&vis[i-1]==0&&cur[i].ch==cur[i-1].ch&&cur[i].num==cur[i-1].num){
		vis[i] = vis[i-1] = 1;
		v1[++t1] = {cur[i-1].id,cur[i].id};
	}
	for(int i=1;i<=n;i++)
	if(vis[i]==0) vc.push_back(cur[i]);
	else vis[i] = 0;
	
	int m = vc.size();
	for(int i=1;i<m;i++)
	if(vis[i]==0&&vis[i-1]==0&&vc[i-1].num==vc[i].num){
		vis[i] = vis[i-1] = 1;
		v2[++t2] = {vc[i-1].id,vc[i].id};
	}
	
	if(t1>t2){
		int x = (t1-t2)/2;
		for(int i=1;i<=x;i++) v2[t2+i] = v1[t1-i+1];
		t2 += x;
		t1 -= x;
	}
	int len = MIN(t1,t2);
	cout<<len<<endl;
	for(int i=1;i<=len;i++){
		cout<<ss[v2[i].p1]<<" "<<ss[v1[i].p1]<<endl;
		cout<<ss[v2[i].p2]<<" "<<ss[v1[i].p2]<<endl;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41829060/article/details/92077440