CF1555A PizzaForces(数学)

一道值得思考的数学题。

计算可知,做一块披萨的时间是 \(2.5\) 分钟,这在 \(3\) 个购买方案中一致。故此只需考虑怎样用 6 8 10 \(3\) 个数字组合出大于等于 \(n\) 且最小的数

可以证明,\(3\) 个数可以组合成不小于 \(6\) 的所有偶数。证明如下:

  • 对于不小于 \(6\) 的任意偶数 \(n\),它都可以被表示为 \(6 \times a + b\) 的形式,其中 \(a \in \mathbb{N}\)\(b \in \{0,2,4\}\)

  • \(b=0\) 时,\(n\) 能被 \(6\) 整除;当 \(b=2\) 时,\(n\) 能被 \(8\) 整除;而当 \(b=4\) 时,\(n\) 能被 \(10\) 整除。证毕。

得到该性质(或许是直接猜到)后,进行分类讨论:

  1. \(n<6\),直接输出 \(15\)
  2. \(n \ge 6\)\(n\) 为奇数,\(n \gets n+1\),转到情况 3。
  3. \(n \ge 6\)\(n\) 为偶数,在 \(6\) 块的基础上,每多 2 块就要加 5 分钟,即 \((n-6) \times \dfrac{5}{2} + 15\)

按上式计算即可。

值得注意的是,如果在代码中混用 puts() 和取消同步流的 cout 进行输出,可能会出现输出顺序错误。

如果在代码中直接 cout<<15+(n-6)*2.5<<endl; ,结果将表示为科学计数法形式。

\(n\) 显然应当使用 long long 类型。而在 CF 中,如果用 printf() 输出,标识符应当为 "%I64d"

下面是 AC 代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	ios::sync_with_stdio(false);
	int T;cin>>T;
	while(T--){
		long long n;cin>>n;
		if(n<6) cout<<15<<endl;
		else{
			if(n&1) ++n;
			cout<<15+(n-6)*5/2<<endl;	
		}
	}
	return 0;
}

THE END

posted @ 2021-08-13 21:03  q0000000  阅读(57)  评论(0编辑  收藏  举报