Uniform Generator
3 5 15 20 63923 99999
3 5 Good Choice 15 20 Bad Choice 63923 99999 Good Choice
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int step,mod;
while(scanf("%d%d",&step,&mod)!=EOF){
int seed[100010]={0};
for(int i=1;i<mod;i++)
seed[i]=(seed[i-1]+step)%mod;
bool flag=true;
sort(seed,seed+mod);
for(int i=0;i<mod;i++)
if(seed[i]!=i){
flag=false;
break;
}
if(flag) printf("%10d%10d Good Choice\n\n",step,mod);
else printf("%10d%10d Bad Choice\n\n",step, mod);
}
return 0;
}
以上代码不管出现不出现循环,都做完了前mod项。时间上会长一些,可以对已产生数做标记,如果又产生了这个数,则陷入循环。时间上会短一些。代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int step,mod;
while(scanf("%d%d",&step,&mod)!=EOF){
int seed[100010]={0},fla[100010]={0};
bool flag=true;
for(int i=1;i<mod;i++){
seed[i]=(seed[i-1]+step)%mod;
if(fla[seed[i]]){//产生循环
flag=false;
break;
}
fla[seed[i]]=1;//标记
}
if(flag){//无循环
sort(seed,seed+mod);
for(int i=0;i<mod;i++)
if(seed[i]!=i){
flag=false;
break;
}
if(flag) printf("%10d%10d Good Choice\n\n",step,mod);
else printf("%10d%10d Bad Choice\n\n",step, mod);
}
else printf("%10d%10d Bad Choice\n\n",step, mod);
}
return 0;
}
优化前:46MS 优化后:31MS
(或许这不应该叫做优化)
为什么不明显呢?首先,本身100000对于计算机不是特别大的数,其次,优化后100000循环里多了操作,时间并没有降下太多。这样做对于产生循环的操作是优化,而不产生循环的操作就是无用功。对于更大的数或许就有作用了。或许这样做也不能叫优化~
怎么办?
然后我又想,生成随机数,直到产生循环为止。如果0~mod-1都产生了,则最多做mod次。如果0~mod-1没有产生就进入循环,则少做了很多次。代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
int main(){
int step,mod;
while(scanf("%d%d",&step,&mod)!=EOF){
int seed=0,f[100010]={0},i;
bool flag=true;
while(!f[seed]){//直到产生循环
f[seed]=1;
seed=(seed+step)%mod;
}
for(int i=0;i<mod;i++)
if(!f[i]){//不是0~mod-1都产生了
flag=false;
break;
}
if(flag) printf("%10d%10d Good Choice\n\n",step,mod);
else printf("%10d%10d Bad Choice\n\n",step, mod);
}
return 0;
}
第二次:31MS
本次优化(可以叫做优化了吧):15MS
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU 1014.Uniform Generator【模拟及优化】【8月16】
原文地址:http://blog.csdn.net/a995549572/article/details/47703873