• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

Sicily 1006. Team Rankings 全排列

        水题,把所有排列全列出来,找出最小的rank即可

#include<iostream>
#include <string>
#include <memory.h>
using namespace std;

string hold = "ABCDE";
string result;
string a[101];
int total;
void all_permutation(int current);
int calculate();
int find(char);

int mini, n;
bool used[5];

int main()
{
	while (cin >> n && n)
	{
		memset(used, false, 5*sizeof(bool));

		for (int i = 0; i < n; i++)
			cin >> a[i];
		mini = calculate();
		result = hold;
		all_permutation(0);
		cout << result << " is the median ranking with value " << mini << "." << endl;
	}
	return 0;
}

void all_permutation(int current)
{
	if (current >= 5)
	{
		total = calculate();
		if (total < mini)
		{
			mini = total;
			result = hold;
		}
	}
	else
	{
		for (int i = 0; i < 5; i++)
			if (!used[i])
			{
				used[i] = true;
				hold[current] = i+'A';
				all_permutation(current+1);
				used[i] = false;
			}
	}
}

int calculate()
{
	int result = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			for (int k = j+1; k < 5; k++)
			{
				if (find(a[i][j]) > find(a[i][k]))
					result++;
			}
		}
	}
	return result;
}

int find(char x)
{
	int index;

	for (int i = 0; i < 5; i++)
	{
		if (hold[i] == x)
		{
			index = i;
			return index;
		}
	}
}

posted on 2010-11-13 17:34  sysuwhj  阅读(1048)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3