洛谷P1618 三连击(升级版)

1.首战自己写:(巨蠢)80分

#include<iostream>
using namespace std;
int tc[10000][3], A_[10000], B_[10000], C_[10000];
int main()
{
	int a, b, c, d, e, f, g, h, i = 0 , A, B, C, tmp1, tmp2,tmp3, k,  judge[11] = { 0 },  p = 0, q = 0,x=0,cnt[10000],flag=0;
	cin >> A >> B >> C;
	for (int a = 1; a <= 9; a++)
		for (int b = 1; b <= 9; b++)
			for (int c = 1; c <= 9; c++)
				for (int d = 1; d <= 9; d++)
					for (int e = 1; e <= 9; e++)
						for (int f = 1; f <= 9; f++)
						{
							if (a != b && a != c && a != d && a != e && a != f && b != c && b != d && b != e && b != f && c != d && c != e && c != f && d != e && d != f && e != f)
							{
								tmp1 = a * 100 + b * 10 + c;
								tmp2 = d * 100 + e * 10 + f;
								if (tmp1*1.0 / A == tmp2*1.0 / B)
								{

									judge[a] = 1;
									judge[b] = 1;
									judge[c] = 1;
									judge[d] = 1;
									judge[e] = 1;
									judge[f] = 1;
									for (k = 1; k <= 9; k++)
										if (judge[k] == 0)
											tc[i][q++] = k;

									q = 0;

									judge[a] = 0;
									judge[b] = 0;
									judge[c] = 0;
									judge[d] = 0;
									judge[e] = 0;
									judge[f] = 0;
									A_[i] = tmp1;
									B_[i] = tmp2;
									i++;
								}
							}
						}
	for (k = 0; k < i; k++)//对每一组A[],B[]找C[]
	{
		p = 0;
		for (g = 0; g < 3; g++)
			for (h = 0; h < 3; h++)
				for (f = 0; f < 3; f++)
				{
					if (g != h && g != i && h != i)
					{
						tmp3 = 100 * tc[k][g] + 10 * tc[k][h] + tc[k][f];
						if (tmp3*1.0 / C == A_[k]*1.0 / A)
						{
							C_[k] = tmp3;
							p = 1;
						}
					}
				}
		if(p==1)
		{
			cnt[x++] = k;//把每一个有三个数的组储存下来
			flag = 1;
		}

	}
	if (flag == 0)
		cout << "No!!!";
	else
	for (i = 0; i < x; i++)
		printf("%d %d %d\n", A_[cnt[i]], B_[cnt[i]], C_[cnt[i]]);

				
}

2.次战:

思路大致同首战。

1.遍历循环前两个三位数,同时根据比例确定第三个三位数;

2.通过estimate判断i,j,z三个数有没有相同的数字(桶法),无则返回1,然后输出三个数;

区别:

首战是先判断是否有重复数字再找到第三个三位数,找第三个数太过啰嗦;

次战是先找数后判断是否有重复,查重函数是简化的关键

首战用很多个for枚举每一位的每一个数,

而次战用两个for直接枚举前两个三位数,明显更简洁;

关于查重函数的思考:

如何对三个三位数的每一个数字进行查重:

1.先想如何对一个三位数查重?

桶法;

2.如何一次性查重三个数?

共用一个桶;

3.如何共用?

用for循环3次,每次代表查重一个数;

4.如何代表?

很简单,if语句;

#include <iostream>
using namespace std;
int A, B, C, f[10] = { 0 }, k = 0, d = 0, temp = 0;
bool estimate(int a, int b, int c) {
	for (int i = 1; i <= 3; i++) {
		if (i == 1) d = a;
		if (i == 2) d = b;
		if (i == 3) d = c;

		while (d)
		{
			if (!f[d % 10]) {
				f[d % 10] = true;
				d /= 10;
			}
			else {
				for (int s = 1; s <= 9; s++) f[s] = 0;
				return 0;
			}
		}
	}
	return 1;
}

int main() {
	cin >> A >> B >> C;
	for (int i = 123; i <= 340; i++) {
		for (int j = i; j <= 999; j++) {
			int z = i*1.0 / A * C;
			if (i == j*1.0 / B * A)
				if (estimate(i, j, z)) {
					cout << i << ' ' << j << ' ' << z << endl;
					temp++;
				}
		}
	}
	if (temp == 0) cout << "No!!!";
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值