HDOJ1014 Uniform Generator 【三种解法(暴力+互质)】

it2022-05-05  123

HDOJ1014

题目 思路 简单来说,题目的意思是给定STEP和MOD,能够把0到MOD-1的数都产生一次的就是Good Choice,否则就是Bad Choice。 1.暴力求解:定义一个seed数组从seed[0]依次往后计算。定义一个布尔型isChange数组,计算出seed[i]的值时,对应的isChange[seed[i]]就记为true。最后如果isChange数组中的值都为true,说明从0到MOD-1的数都产生了,结果为Good Chioce。 2.互质:如果STEP和MOD互质,结果为Good Choice。 3.基于方法一的优化:不用isChange数组,用一个计数器记录产生的seed数组元素的数量。一旦seed等于零,说明产生的数出现了循环,break。这样的话相比方法一节省了很多内存。

代码 暴力求解

#include<cstdio> #include<iostream> #include<string.h> #include <iomanip> #include <cstring> using namespace std; int main() { int STEP, MOD, i, flag; bool isChange[100000]; int seed[100000]; while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000) { memset(isChange, false, sizeof(isChange)); flag = 1; seed[0] = 0; isChange[seed[0]] = true; for(i=0;i<MOD-1;i++) { seed[i+1]= (seed[i] + STEP)%MOD; isChange[seed[i+1]] = true; } for(i=0;i<MOD;i++) { if(isChange[i]==false) { flag = 0; break; } } cout << setiosflags(ios::right) << setw(10) << STEP << setw(10) << MOD << " "; cout << setiosflags(ios::left); if(flag==1) { printf("Good Choice\n\n"); } else { printf("Bad Choice\n\n"); } } }

互质

#include<stdio.h> int zg(int step, int mod) { if(mod==0) { return step; } else { zg(mod, step%mod); } } int main() { int STEP, MOD, i; while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000) { if(zg(STEP, MOD)==1) { printf("dd Good Choice\n\n",STEP,MOD); } else { printf("dd Bad Choice\n\n",STEP,MOD); } } }

暴力求解优化(内存优化)

#include<stdio.h> int main() { int STEP, MOD, i; int count; int seed; while(~scanf("%d%d", &STEP, &MOD)&&STEP>=1&&MOD<=100000) { count = 1; seed = 0; for(i=0;i<MOD;i++) { seed= (seed + STEP)%MOD; if(seed!=0) { count++; } else { break; } } if(count==MOD) { printf("dd Good Choice\n\n",STEP,MOD); } else { printf("dd Bad Choice\n\n",STEP,MOD); } } }

Conclusion 条条大路通罗马,可以多尝试一些方法。另外,输出格式仍然是一个不可忽视的问题,仔细审题。


最新回复(0)