SRM 471
作者:互联网
原文链接:http://www.cnblogs.com/xiao_wu/archive/2010/05/27/1745748.html
2
3 bool nums[maxn];
4 int prime[maxn];
5
6 void init()
7 {
8 int i , j;
9 int pl = 0;
10 nums[0] = 1 , nums[1] = 1;
11 memset(prime , true , sizeof(prime));
12 for(i = 2; i < maxn; i ++) {
13 if(!nums[i])
14 prime[pl ++] = i;
15 for(j = 0; j < pl && i * prime[j] < maxn; j++)
16 {
17 nums[i * prime[j]] = 1;
18 if(!( i % prime[j] ) )
19 break;
20 }
21 }
22 }
23
24 class PrimeSequences {
25 public:
26 int getLargestGenerator(int N, int D)
27 {
28 init();
29 for(int i=N; i >= 2; i--) {
30 int len = 0, ans = i;
31 while( !nums[ans] ) {
32 len ++;
33 ans >>= 1;
34 }
35 if(len >= D)
36 return i;
37 }
38 return -1;
39 }
40 };
2 struct node { int v , w , state; } ;
3
4 queue< node > que;
5 int path[26][26], row , clo;
6 int hash[26][1 << 13][13];
7
8 class ThirteenHard {
9 public:
10 int solve()
11 {
12 for(int i=0; i < row; i++)
13 for(int j=0; j < (1 << 13); j++)
14 for(int k=0; k < 13; k++)
15 hash[i][j][k] = inf ;
16 node tt , nn;
17 tt.v = tt.w = tt.state = 0;
18 que.push(tt);
19 while(!que.empty())
20 {
21 tt = que.front(); que.pop();
22 int u = tt.v , w = tt.w , state = tt.state;
23 for(int i=0; i < row; i++)
24 {
25 if(path[u][i])
26 {
27 nn.v = i;
28 nn.w = w + path[u][i];
29 if(nn.w % 13 == 0 || ((1 << (nn.w % 13)) & state))
30 continue;
31 nn.state = state + (1 << (nn.w % 13));
32 int k = nn.w % 13;
33 if(hash[nn.v][nn.state][k] > nn.w)
34 {
35 hash[nn.v][nn.state][k] = nn.w;
36 que.push(nn);
37 }
38 }
39 }
40 }
41 int ans = inf;
42 for(int i=0; i < (1 << 13); i++)
43 for(int j=0; j < 13; j++)
44 ans = min(hash[row - 1][i][j] , ans);
45 if(ans == inf)
46 return -1;
47 return ans;
48 }
49
50 int getc(char c)
51 {
52 if(c >= 'A' && c <= 'Z')
53 return c - 'A' + 1;
54 if(c >= 'a' && c <= 'z')
55 return c - 'a' + 27;
56 return 0;
57 }
58
59 int calcTime(vector <string> city)
60 {
61 row = city.size() ;
62 clo = city[0].size();
63 for(int i=0; i < row; i++)
64 for(int j=0; j < clo; j++)
65 path[i][j] = getc( city[i][j] );
66 return solve();
67 }
68 };
下载了个KawigiEdit,挺好用的,虽然我还不大会用,那个G++的的路径不知道指向哪才行。
茫茫长的头文件,略去略去。
250p :
直接开一个10^7的 int 数组和 bool 数组来进行素数判定,然后从后面开始扫,若 >= D则可以跳出来
代码 1 const int maxn = 10000001;2
3 bool nums[maxn];
4 int prime[maxn];
5
6 void init()
7 {
8 int i , j;
9 int pl = 0;
10 nums[0] = 1 , nums[1] = 1;
11 memset(prime , true , sizeof(prime));
12 for(i = 2; i < maxn; i ++) {
13 if(!nums[i])
14 prime[pl ++] = i;
15 for(j = 0; j < pl && i * prime[j] < maxn; j++)
16 {
17 nums[i * prime[j]] = 1;
18 if(!( i % prime[j] ) )
19 break;
20 }
21 }
22 }
23
24 class PrimeSequences {
25 public:
26 int getLargestGenerator(int N, int D)
27 {
28 init();
29 for(int i=N; i >= 2; i--) {
30 int len = 0, ans = i;
31 while( !nums[ans] ) {
32 len ++;
33 ans >>= 1;
34 }
35 if(len >= D)
36 return i;
37 }
38 return -1;
39 }
40 };
500p:
一开始开了一个hash[ 25 ][ 1 << 13 ]的数组进行判重,硬是过不了case 94 , 原因是,同个state的点有可能由不同的模13值所得来,若此时由于该点所存的路径长度较长而被删除,就会导致删除可行解,因为最小值并非可行解。所以要开成hash[ 25 ][1 << 13][13]进行判重。
其中1 << 13的目的是记录sum值在模13后的值,如果重叠,则表示这个路径上有连续的点使得 mod 13 == 0 (鸽巢原理)
代码 1 const int inf = 19999999;2 struct node { int v , w , state; } ;
3
4 queue< node > que;
5 int path[26][26], row , clo;
6 int hash[26][1 << 13][13];
7
8 class ThirteenHard {
9 public:
10 int solve()
11 {
12 for(int i=0; i < row; i++)
13 for(int j=0; j < (1 << 13); j++)
14 for(int k=0; k < 13; k++)
15 hash[i][j][k] = inf ;
16 node tt , nn;
17 tt.v = tt.w = tt.state = 0;
18 que.push(tt);
19 while(!que.empty())
20 {
21 tt = que.front(); que.pop();
22 int u = tt.v , w = tt.w , state = tt.state;
23 for(int i=0; i < row; i++)
24 {
25 if(path[u][i])
26 {
27 nn.v = i;
28 nn.w = w + path[u][i];
29 if(nn.w % 13 == 0 || ((1 << (nn.w % 13)) & state))
30 continue;
31 nn.state = state + (1 << (nn.w % 13));
32 int k = nn.w % 13;
33 if(hash[nn.v][nn.state][k] > nn.w)
34 {
35 hash[nn.v][nn.state][k] = nn.w;
36 que.push(nn);
37 }
38 }
39 }
40 }
41 int ans = inf;
42 for(int i=0; i < (1 << 13); i++)
43 for(int j=0; j < 13; j++)
44 ans = min(hash[row - 1][i][j] , ans);
45 if(ans == inf)
46 return -1;
47 return ans;
48 }
49
50 int getc(char c)
51 {
52 if(c >= 'A' && c <= 'Z')
53 return c - 'A' + 1;
54 if(c >= 'a' && c <= 'z')
55 return c - 'a' + 27;
56 return 0;
57 }
58
59 int calcTime(vector <string> city)
60 {
61 row = city.size() ;
62 clo = city[0].size();
63 for(int i=0; i < row; i++)
64 for(int j=0; j < clo; j++)
65 path[i][j] = getc( city[i][j] );
66 return solve();
67 }
68 };
转载于:https://www.cnblogs.com/xiao_wu/archive/2010/05/27/1745748.html
标签:return,nn,int,tt,SRM,++,state,471 来源: https://blog.csdn.net/weixin_30252155/article/details/96643234