【CCPC】2022威海站 E. Python Will be Faster than C++ | 数学、模拟

141 阅读1分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

【CCPC】2022威海站 E. Python Will be Faster than C++ | 数学、模拟

题目链接

Problem - E - Codeforces

题目

image.png

题目大意

给定长度为 nn 的数组 a1,a2,...,ana_1,a_2,...,a_n,其中 aia_i 表示当 1in1\le i\le n3.i3.i 版本的 Python 运行某代码需要花费的时间。给定 kk 表示 C++ 运行该代码需要花费的时间。

预测当 i>ni>n3.i3.i 版本的 Python 运行该代码需要花费的时间

ai=max(0,2×ai1ai2)a_i=\max(0,2\times a_{i-1}-a_{i-2})

请输出预计最低哪个版本的 Python 运行该代码需要的时间小于 kk。输入数据保证 k<min{a1,a2,...,an}k<\min\{a_1,a_2,...,a_n\}

思路

显然只与整个数组的最后两项有关。令 x=an1,y=anx=a_{n-1},y=a_n,则从 n1n-1 开始各个版本的 Python 运行该代码需要的时间为

x,y,2×yx,2×(2×yx)y,...,0,0,0,...x,y,2\times y-x,2\times(2\times y-x)-y,...,0,0,0,...

化简得

x,y,(yx)+y,2×(yx)+y,3×(yx)+y,...,0,0,0,...x,y,(y-x)+y,2\times(y-x)+y,3\times(y-x)+y,...,0,0,0,...

3.(i+n)3.(i+n) 版本的 Python 运行该代码需要的时间为 ai+n=i×(yx)+ya_{i+n}=i\times (y-x)+y。问题转化为求满足 i×(yx)+y<ki\times (y-x)+y<k 的最小的 ii

如果 yx0y-x\ge 0,则 ai+nan>ka_{i+n}\ge a_n>k,上述方程无解,输出 Python will never be faster than C++。否则解得 i>kyyxi>\frac{k-y}{y-x},则最小的运行时间小于 kk 的Python版本 ans=kyyx+n+1ans=\frac{k-y}{y-x}+n+1,输出答案 Python 3.{ans} will be faster than C++ 即可。

由于数据范围很小也没有多组数据,在发现如果 yx0y-x\ge 0 则无解排除这种情况之后,也可以暴力计算每个版本运行某代码需要的时间去和 kk 进行比较。

代码

#include <iostream>
#include <algorithm>
#include <math.h>
#include <stdio.h>
using namespace std;
using LL=long long;
const int N=500001;
const LL mod=1000000007;
//const LL mod=998244353;
LL a[N];
LL solve()
{
	int n;
	LL k;
	scanf("%d",&n);
	scanf("%lld",&k);
	for (int i=1;i<=n;++i) scanf("%lld",&a[i]);
	LL x=a[n-1];
	LL y=a[n];
	if (y-x>=0) printf("Python will never be faster than C++\n");
	else printf("Python 3.%d will be faster than C++\n",n+(k-y)/(y-x)+1);
	return 0;
}
int main()
{
	int T=1;
	while (T--) solve();
	return 0;
}