USACO SuperPrime Rib

来源:互联网 发布:成都知美术馆地址 编辑:程序博客网 时间:2024/05/17 04:52

竟然第一次就通过了,难得啊~~~

思路是这样的: 对每一个SuperPrime,最高位在{2,3,5,7}里挑,其他位在{1,3,7,9}里挑。
所以在构造n位的SuperPrime数的时候,从高位(第一位)到低位(第N位),采用递归;并且分level == 1 , level > 1两种情况。 level == N + 1 的时候结束。见代码

/*ID: wangxin12PROG: sprimeLANG: C++*/#include <iostream>#include <fstream>#include <vector>#include <math.h>#include <string>using namespace std;int N;bool isPrime(int n) {        bool flag = true;        int start = 2;      int end = sqrt((double)n);      for(int i = start; i <= end; i++) {          int mod = n % i;          if( mod == 0) {              flag = false;              break;          }      }      return flag;  }  void f(int level, vector<int> & v1) {//base caseif(level == N + 1) {ofstream fout("sprime.out");for(int i = 0; i < v1.size(); i++) {fout<<v1[i]<<endl;}fout.close();return;}vector<int> curr;if(level == 1) {curr.push_back(2);curr.push_back(3);curr.push_back(5);curr.push_back(7);f(level + 1, curr);return;}for(int i = 0; i < v1.size(); i++) {int temp;temp = v1[i] * 10 + 1;if(isPrime(temp)) curr.push_back(temp);temp = v1[i] * 10 + 3;if(isPrime(temp)) curr.push_back(temp);temp = v1[i] * 10 + 7;if(isPrime(temp)) curr.push_back(temp);temp = v1[i] * 10 + 9;if(isPrime(temp)) curr.push_back(temp);}f(level + 1, curr);return;}int main() {ifstream fin("sprime.in");fin>>N;fin.close();vector<int> result;f(1, result);    return 0;}



原创粉丝点击