标签:丑数 cnt 错误 min int back dfs ++ 票据
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
bool st[10000010];
int a,b,n,m,t;
int gcd(int a, int b) // 欧几里得算法
{
return b ? gcd(b, a % b) : a;
}
void dfs(int x){
if(x>=t)return;
st[x]=1;
dfs(x+m);
dfs(x+n);
}
int main(){
cin>>a>>b;
m=max(a,b);
n=min(a,b);
t=m*n/gcd(m,n);
dfs(n);
dfs(m);
for(int i=t-1;i>m;i--){
//cout<<"s["<<i<<"]="<<st[i]<<endl;
if(st[i]==0){
cout<<i;
return 0;
}
}
}
上面这个算法只过了百分之50的数据
#include<iostream>
#include <vector>
using namespace std;
vector<int>v;
int i,j,ans,cnt=1,t;
int a,b;
int main(){
v.push_back(0);
cin>>a>>b;
int m=max(a,b);
int n=min(a,b);
int x=100;
while(1){
t=min(v[i]+n,v[j]+m);
if(t==v[i]+n)i++;
if(t==v[j]+m)j++;
if(t!=v.back()){
if(t==v.back()+1){
cnt++;
if(cnt==n){cout<<ans;return 0;}
}
else cnt=1,ans=t-1;
v.push_back(t);
}
}
}
第一种方法虽然思路简单,但是时间复杂度为2的n次方太高了,数据少的时候可以很快过,但是对st表里的值操作次数重复太多
== 接下来我们来看一道题----丑数==
class Solution {
public:
int getUglyNumber(int n) {
vector<int>v;
v.push_back(1);
int a=0,b=0,c=0;
int cnt=1;
if(n==1)return 1;
while(1){
int t=min(v[c]*5,min(v[a]*2,v[b]*3));
if(t==v[c]*5)c++;
if(t==v[a]*2)a++;
if(t==v[b]*3)b++;
if(t!=v.back()){
cnt++;
//cout<<cnt<<endl;
if(cnt==n){
return t;
}
v.push_back(t);
}
}
}
};
标签:丑数,cnt,错误,min,int,back,dfs,++,票据 来源: https://blog.csdn.net/supreme567/article/details/115793572
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。