田忌赛马求解!!!!!!!

时间限制:C/C++ 1000MS,其他语言 2000MS
内存限制:C/C++ 256MB,其他语言 512MB
难度:简单
出题人:root

描述

在田忌赛马的故事中,孙膑用自己的下等马对战对手的上等马,自己上等马对阵对手的中等马,自己的中等马对阵对手的下等马,从而赢得了胜利。现在即将进行的是N匹马的赛马比赛。双方队伍的马各分为N等。已知只有当我方马的等级比对方马等级高X等以上(包含X)时,我方才可以取得这场比赛的胜利。如果在N场比赛中我方的胜场数大于对方,则我方取得最终的胜利。现在已知对方这N场比赛的出战方案,请计算所有令我方最终获胜的出战方案。

输入描述

第一行两个整数,N和X。N≤9, 0 ≤ X < N。 第二行N个正整数,A(1)…A(N)。A(i)表示第i场比赛对方马的等级,1≤i≤N。等级越高越强。

输出描述

按字典序输出所有我方最终获胜的方案,每个方案一行。每行是N个正整数,第i个数表示我方第i场比赛马的等级。

#include<iostream>  
#include<algorithm> 
#include<vector>
using namespace std;
bool MaxToMin(const int& a ,const int& b);
 
int main()
{	
	int n,n1,n2;
	int i,j,k;
	int speed;
	int WinTimes,LoseTimes,money;
	vector<int> TianHorse;
	vector<int> KingHorse;
	while(cin>>n)
	{
		if(0==n)
			break;
		money=WinTimes=LoseTimes=0;
		n1=n2=n-1;
		TianHorse.clear();
		KingHorse.clear();
		for(i=0;i<n;i++)
		{
			cin>>speed;
			TianHorse.push_back(speed);
		}
		for(i=0;i<n;i++)
		{
			cin>>speed;
			KingHorse.push_back(speed);
		}
		sort(TianHorse.begin(),TianHorse.end(),MaxToMin);
		sort(KingHorse.begin(),KingHorse.end(),MaxToMin);
		i=j=0;
		for(k=0;k<n;k++)
		{
			if(TianHorse[n1]>KingHorse[n2])
			{
				n1--;
				n2--;
				WinTimes++;
			}
			else if(TianHorse[n1]<KingHorse[n2])
			{
				LoseTimes++;
				n1--;
				j++;
			}
			else
			{
				if(TianHorse[i]>KingHorse[j])
				{
					WinTimes++;
					i++;
					j++;
				}
				else if(TianHorse[n1]<KingHorse[j])
				{
					LoseTimes++;
					n1--;	
					j++;
				}
				else
					break;
			}
		}
		money=(WinTimes-LoseTimes)*200;
		cout<<money<<endl;
	}
	return 0;
}
bool MaxToMin(const int& a ,const int& b)
{
	if (a>=b) 
		return true;
	else
		return false;
}
2 个赞

@hnczfh02

可以试试bfs搜索所有结果

试试

有结果没?
@hnczfh02

PA了

代码发来

???

AC了?

ac了,超时了改成print就可以了

1 个赞

OK