[LNOI2022]吃

89 篇文章 0 订阅

题目

题目背景
“看了一下,发现 b a − 1 \frac{b}{a-1} a1b 是一个判据;写了一发, 9 9 9 组样例全过。我就交上去了。”

——《 O n e I n D a r k \sf OneInDark OneInDark 为什么 W A \rm WA WA 穿了》

题目描述
传送门 to LOJ

思路

这就是蓝题吗,爱了爱了,以后我要多刷蓝题,争取提高组不报零 🤗

首先猜贪心,然后发现 S < b a − 1 S<\frac{b}{a-1} S<a1b 时,应当将元素 从乘变为加。即该判据只对选择了乘法的元素有效。因此直接按照该值排序是错误的。

啥是正确的?那就是 不要忽略 S S S 的实际含义。我的想法固执于枚举 S S S 然后讨论谁选加谁选乘,然后人傻了 😢

不过这很容易观察到吗?不妨设 a > 1 a>1 a>1,此时有 S ⩾ b ⩾ b a − 1 S\geqslant b\geqslant\frac{b}{a-1} Sba1b,这里 ⟨ a , b ⟩ \langle a,b\rangle a,b 是任意一个选择加法的元素。那么我们就取 max ⁡ { b a − 1 } \max\{\frac{b}{a-1}\} max{a1b} 保持为加法,则其余元素都应选为乘法(因为满足上文的判据)!

所以,除 a = 1 a=1 a=1 的元素,最多一个元素选择加法。其实你举个 n = 2 n=2 n=2 的例子一下就明白了:俩都选,效果是 ( b 1 + b 2 ) (b_1{+}b_2) (b1+b2),设 b 1 < b 2 b_1<b_2 b1<b2,那为啥不改成 a 1 b 2 ⩾ 2 b 2 a_1b_2\geqslant 2b_2 a1b22b2 呢?说白了,乘法比加法优秀啊。

因此枚举这个元素即可。判断是容易的。时间复杂度 O ( n ) \mathcal O(n) O(n)

另:存在 d p \tt dp dp 做法,但是 DDG \textsf{DDG} DDG 没给我讲懂,所以咕掉哩。

代码

#include <cstdio> // Almighty XJX yyds!!!
#include <algorithm> // oracle: ZXY yydBUS!!!
#include <cstring> // Danming score!!!
#include <cctype>
using llong = long long;
# define rep(i,a,b) for(int i=(a); i<=(b); ++i)
# define drep(i,a,b) for(int i=(a); i>=(b); --i)
# define rep0(i,a,b) for(int i=(a); i!=(b); ++i)
inline int readint(){
	int a = 0, c = getchar(), f = 1;
	for(; !isdigit(c); c=getchar()) if(c == '-') f = -f;
	for(; isdigit(c); c=getchar()) a = a*10+(c^48);
	return a*f;
}

const int MAXN = 500000;
int a[MAXN], b[MAXN];

const int MOD = 1e9+7;
int main(){
	int n = readint();
	rep(i,1,n) a[i] = readint();
	llong s = 1;
	rep(i,1,n){
		b[i] = readint();
		if(a[i] == 1) s += b[i];
	}
	int id = 0; b[0] = 0, a[0] = 1;
	rep(i,1,n) if(a[i] != 1)
		if((s+b[i])*a[id] > (s+b[id])*a[i])
			id = i; // best choice
	s = (s+b[id])%MOD;
	rep(i,1,n) if(i != id) s = s*a[i]%MOD;
	printf("%lld\n",s);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值