3569168_ac_0ms_344k.cc

来自「北大大牛代码 1240道题的原代码 超级权威」· CC 代码 · 共 125 行

CC
125
字号
#include <set>
#include <vector>
#include <stdio.h>
#include <algorithm>

using namespace std;

typedef set <int> SI;
typedef vector <int> VI;

VI score;
SI num;
int size;
struct triple
{
	int a, b, c;
};

vector <triple> cb;

void init()
{
	num.clear();
	score.clear();
	num.insert(50);
	for (int i = 0; i <= 20; i++)
	{
		num.insert(i);
		num.insert(i * 2);
		num.insert(i * 3);
	}
	size = num.size();
	for (SI::iterator it = num.begin(); it != num.end(); ++it)
	{
		score.push_back((*it));
	}
}

triple make_triple(int a, int b, int c)
{
	triple ret;

	ret.a = a;
	ret.b = b;
	ret.c = c;
	return ret;
}

int solve()
{
	int ans = 0;

	for (int i = 0; i < cb.size(); i++)
	{
		triple tp = cb[i];
		int a, b, c;
		a = tp.a;
		b = tp.b;
		c = tp.c;
		if (a == b && b == c)
		{
			ans++;
			continue;
		}
		if (a != b && b != c && a != c)
		{
			ans += 6;
			continue;
		}
		ans += 3;
	}
	return ans;
}

void work()
{
	int n, a, b;

	while (scanf("%d", &n) == 1 && n > 0)
	{
		cb.clear();
		for (int i = 0; i < size; i++)
		{
			a = score[i];
			if (a > n)
			{
				break;
			}
			for (int j = i; j < size; j++)
			{
				b = a + score[j];
				if (b > n)
				{
					break;
				}
				for (int k = j; k < size; k++)
				{
					if (b + score[k] == n)
					{
						cb.push_back(make_triple(score[i], score[j], score[k]));
						break;
					}
				}	
			}
		}
		if (cb.empty())
		{
			printf("THE SCORE OF %d CANNOT BE MADE WITH THREE DARTS.\n", n);
		}
		else
		{
			printf("NUMBER OF COMBINATIONS THAT SCORES %d IS %d.\n", n, cb.size());
			printf("NUMBER OF PERMUTATIONS THAT SCORES %d IS %d.\n", n, solve());
		}
		puts("**********************************************************************");
	}
	puts("END OF OUTPUT");
}

int main()
{
	init();
	work();
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?