CSES硬币组合1代码超时原因咨询:修改const int MOD后解决
为什么修改MOD为const能解决Coin Combinations 1的TLE问题?
核心原因是编译器对const变量和普通变量的优化程度完全不同:
- 当你用
int MOD=1e9+7时,MOD是一个普通全局变量,每次执行dp[i]%=MOD时,CPU都要从内存中读取MOD的值。而这道题的循环次数极多(比如x可达到1e6,内层循环遍历n个硬币,总操作数轻松破1e8),频繁的内存访问会累积出可观的时间开销,直接导致程序超时。 - 改成
const int MOD=1e9+7后,编译器会将MOD识别为编译时常量,直接把1e9+7这个数值硬编码到取模指令里,不需要每次去内存取值,彻底消除了这部分内存访问的开销,程序运行速度大幅提升,刚好满足时间限制。
另外提两个小细节帮你进一步优化代码:
- 你用的
int nums[n]和int dp[x+1]是C风格变长数组(VLA),部分编译器对VLA的内存分配和访问优化较差,换成vector<int> nums(n)和vector<int> dp(x+1, 0)会更稳定,也能避免栈溢出风险(当x很大时,栈上的dp数组可能超出栈空间)。 - 输入输出可以加
ios_base::sync_with_stdio(false); cin.tie(NULL);来关闭同步,进一步加快输入速度。
你的原代码:
#include <bits/stdc++.h> #define int long long using namespace std; int MOD=1e9+7; signed main() { int n,x; cin>>n>>x; int nums[n]; for(int i=0;i<n;i++){ cin>>nums[i]; } int dp[x+1]={0}; dp[0]=1; for(int i=1;i<=x;i++){ for(int q:nums){ if(i-q>=0){ dp[i]+=dp[i-q]; dp[i]%=MOD; } } } cout<<dp[x]<<endl; }
内容的提问来源于stack exchange,提问作者Aryan phad
相关产品推荐
相关产品推荐

