100分wa了,#sub 1被卡了
  • 板块P1249 最大乘积
  • 楼主encode
  • 当前回复1
  • 已保存回复1
  • 发布时间2025/1/31 16:03
  • 上次更新2025/2/1 04:03:40
查看原帖
100分wa了,#sub 1被卡了
227468
encode楼主2025/1/31 16:03

一次贪心两次特判

第一次特判最后一步取连续两个最大数

第二次特判 最后一步取 间隔一个数的两个最大数

#include <iostream>
#include <vector>
using namespace std;
typedef vector<int> VI;
int q[10010];
VI mul(VI a, int b)
{
	VI c;
	int t = 0;	
	for (int i = 0; i < a.size()||t; ++i) {
		if (i < a.size()) t += a[i] * b;
		c.push_back(t%10);
		t /= 10;
	}
	return c;	
}
int main()
{
	int n;
	scanf("%d", &n);
	VI c = {1};
	int i;
	for (i = 2; i * 2 < n; ++i) {
		n -= i;
		q[i] = 1;
	}

	if (n == i || n == i + 1) q[n] = 1;
	else { // 第一次特判
		int x = i + i + 1 - n;			
		int t = i + 1;
		if (x == 1) x = 2, ++t; // 第二次特判,1不能取
		q[x] = 0;
		q[t] = q[i] = 1;
	}

	for (int i = 2; i <= 10000; ++i) {
		if (q[i]) {
			printf("%d ", i);
			c = mul(c, i);
		}
	}
	puts("");
	for (int i = c.size() - 1; i >= 0; --i)
		printf("%d", c[i]);
	return 0;
}

2025/1/31 16:03
加载中...