c++ - codeforces 问题名为 Strange List the "MEMORY LIMIT EXCEEDED"
问题描述
参考codeforces中名为“奇怪列表”的问题,下面是我的代码
但问题是所有测试用例都通过了,但最后一个测试用例显示“内存超出限制”,最后一个测试用例的值也很大,比如 n 是 100000。请指导我解决它的方法
#include<bits/stdc++.h>
#define ll long long int
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
ll ele,sum=0,i,j,h,n,x;
cin>>n>>x;
vector <ll> vec;
for(i=0;i<n;i++)
{
cin>>ele;
vec.push_back(ele);
}
for(i=0;i>=0;i++)
{
if(vec.at(i)%x==1)
{
break;
}
else
{
h=vec.at(i)/x;
for(j=0;j<x;j++)
{
vec.push_back(h);
}
}
}
for(i=0;i<vec.size();i++)
{
sum+=vec.at(i);
}
cout<<sum<<"\n";
}
}
解决方案
你可以使用动态规划来解决这个问题
存储结果的实现可以通过使用对的向量
来完成下面是AC 代码,演示了如何在内存消耗方面有效地解决这些问题......快乐编码: )
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
ll t;
cin>>t;
while(t--){
ll n,x;
cin>>n>>x;
vector<pair<ll,ll>> a(n);
for(int i=0;i<n;i++){
cin>>a[i].first;
a[i].second=a[i].first; // Storing initial results in second part of pair
}
ll s=0;
ll d=0;
ll r=0;
ll k=0;
while(++r){
for(int i=0;i<n;i++){
if(a[i].first%x==0){
s+=a[i].second;
a[i].first=a[i].first/x;
a[i].second=(a[i].first*pow(x,r)); // updating results
}
else{
s+=a[i].second;
if(d==0)
k=i;
d=1;
}
}
if(d)
break;
}
for(int i=0;i<k;i++)
s+=a[i].second; // getting desired sum
cout<<s<<"\n"; // printing answer
}
}
推荐阅读
- group-by - 根据列值在 Group By 之后显示默认值
- css - 无法在 Internet Explorer 中定位我的标题
- wordpress - 只有 Wordpress 用户可以看到
- imagemagick - ImageMagick 命令行渐变
- c# - 如何隐藏应用程序视图
- dialogflow-es - 如何针对特定意图进行 Dialogflow 回退
- python - cProfile 在运行多处理 Python 代码时导致酸洗错误
- c# - 替换大 POCO 对象的几个属性的值?
- networking - 使用 Cisco 和 Watchguard 设备诊断 400Mbps 的网络速度上限
- gluon - 如何在 Apache NetBeans 9.0 中安装 Gluon 插件?