想知道为什么会WA
查看原帖
想知道为什么会WA
195198
E1_de5truct0r楼主2021/1/22 14:17

自己调试了半天没有成果,求助(本人常常脑抽如果错误低级请见谅)

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#define I using
#define AK namespace
#define IOI std
using namespace std;
struct st
{
	int num,len,id; //num存元音个数,len存长度,id存顺序 
	char lst; //存最后一个元音是什么 
}a[100005];

inline bool cmp(st a,st b)
{
	if(a.num!=b.num) return a.num>b.num; //先按着元音个数排序 
	else return a.lst>b.lst; //然后按着最后的元音字母大小顺序排 
}
char str[100005][105];
struct ans
{
	int a,b,c,d;
}b[100005];
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		cin>>str[i];
		//元音个数 ↓ 
		int len=strlen(str[i]);
		for(int j=0;j<len;j++)
		{
			if(str[i][j]=='a'||str[i][j]=='e'||str[i][j]=='i'||str[i][j]=='o'||str[i][j]=='u')
			{
				a[i].lst=str[i][j]; //更新最后的元音 
				a[i].num++; //元音个数++ 
			}
		}
		//长度等其他变量 ↓ 
		a[i].len=len;
		a[i].id=i;
	}
	sort(a+1,a+n+1,cmp); //排序,方便把相同的放到一起 
	
	queue<int> q1,q2; //q1存储能作为第一对的歌词,q2存储能作为第二个的歌词
	for(int i=1;i<n;i++)
	{
		if(a[i].num==a[i+1].num)
		{
			if(a[i].lst==a[i+1].lst)
			{
				q2.push(a[i].id);
				q2.push(a[i+1].id);
			}
			else
			{
				q1.push(a[i].id);
				q1.push(a[i+1].id);
			}
			i++;
		}
	}//挑能够做第二对歌词的 能做第二对歌词的一定能做第一对歌词
	
	int m=0;
	if(q2.size()<q1.size())
	{
		while(!q2.empty())
		{
			int fr1,fr2,ls1,ls2;
			fr1=q1.front();q1.pop();
			ls1=q2.front();q2.pop();
			if(q2.empty()) break;
			fr2=q1.front();q1.pop();
			ls2=q2.front();q2.pop();
			b[++m].a=fr1;
			b[m].b=ls1;
			b[m].c=fr2;
			b[m].d=ls2;
		}
		//能做第二对歌词的如果小于能做第一对歌词的,那么只能用所有的能做第二对歌词的来做 
	}
	else
	{
		while(!q1.empty())
		{
			int fr1,fr2,ls1,ls2;
			fr1=q1.front();q1.pop();
			ls1=q2.front();q2.pop();
			if(q1.empty()) break;
			fr2=q1.front();q1.pop();
			ls2=q2.front();q2.pop();
			b[++m].a=fr1;
			b[m].b=ls1;
			b[m].c=fr2;
			b[m].d=ls2;
		}
		while(!q2.empty())
		{
			int fr1,fr2,ls1,ls2;
			fr1=q2.front();q2.pop();
			if(q2.empty()) break;
			ls1=q2.front();q2.pop();
			if(q2.empty()) break;
			fr2=q2.front();q2.pop();
			if(q2.empty()) break;
			ls2=q2.front();q2.pop();
			b[++m].a=fr1;
			b[m].b=ls1;
			b[m].c=fr2;
			b[m].d=ls2;
		}
		//先用完第一对,再用第二对自己跟自己搭配 
	}
	std::cout<<m<<endl;
	for(int i=1;i<=m;i++)
		cout<<str[b[i].a]<<" "<<str[b[i].b]<<"\n"<<str[b[i].c]<<" "<<str[b[i].d]<<endl;
	return 0;
}
2021/1/22 14:17
加载中...