LuoguP7019 [NWRRC2017]Auxiliary Project 题解

Update

  • \(\texttt{2021.6.24}\) 修改了一处格式上的错误和一处笔误。

Content

已知用 LED 灯来显示 \(0\sim9\) 这十个数字分别需要 \(6,2,5,5,4,5,6,3,7,6\) 段 LED 灯管组成,现在,你需要点亮正好 \(n\) 段 LED 灯管,使得组成的数字的和最大。

数据范围:\(2\leqslant n\leqslant 2\times 10^5\)

Solution

我们不妨用 \(\dfrac{\text{数字}}{\text{灯管段数}}\) 来衡量点亮这些数的价值,得到的表格如下:

数字 \(0\) \(1\) \(2\) \(3\) \(4\) \(5\) \(6\) \(7\) \(8\) \(9\)
价值(保留 \(2\) 位小数) \(0\) \(0.5\) \(0.4\) \(0.6\) \(1\) \(1\) \(1\) \(2.33\) \(1.14\) \(1.5\)

不难发现这样的话,尽可能多地组成 \(7\) 的价值是最大的,所以我们多组成 \(7\),假设组完以后的数的和为 \(ans\)。然后对剩下的灯管数量,也就是 \(n\mod 3\),进行分类讨论。

  1. \(n\mod 3=0\),此时的答案就是 \(ans\)
  2. \(n\mod 3=1\),此时无法再组成数,然而题目限制我们要正好 \(n\) 段灯管,所以我们考虑把一个 \(7\) 给去掉,然后剩下 \(4\) 段灯管,此时可以组成一个 \(4\)。因此答案就是 \(ans-7+4=ans-3\)
  3. \(n\mod 3=2\),此时可以再组成一个 \(1\),不需要再去舍弃了(舍弃了很明显不是最优方案),那么此时答案就是 \(ans+1\)

那么这道题目就做完了。

Code

int n;
long long ans;

int main() {
	scanf("%d", &n);
	ans = n / 3 * 7;
	n %= 3;
	if(n == 1) printf("%d", ans - 3);
	else if(n == 2) printf("%d", ans + 1);
	else printf("%d", ans);
	return 0;
}
posted @ 2021-12-16 14:51  Eason_AC  阅读(47)  评论(0)    收藏  举报