pku 3349 Snowflake Snow Snowflakes

http://poj.org/problem?id=3349 题目的意思就是给你一堆雪人的胳膊长,每个雪人都有六个胳膊,他们给出的顺序是按顺时针,或是逆时针给出的,但是六个里以哪个开头是不确定的。如果里面有任何两个相同,则就输出  “Twin snowflakes found.”   否则输出“No two snowflakes are alike.”。一开始我还以为是让找有多少个snowflakes,我想数据那么大,再怎么弄,也是TLE啊。原来是弄错题意了。悲剧。题意弄懂了,可是还是TLE,去看别人的解题报告,真厉害,这也能想到,而且代码一点不复杂,不过感觉还是很慢,3000多MS呢,呵呵,不过思路挺简单的

思路:就是用一个hash数组标记那些出现过的,是对他们的胳膊求和后在取余进行标记,要不这样会TLE的。然后再任意取两个进行比较,如果相同,则直接返回true,否则继续查找。

还是看代码吧

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<vector>
5 using namespace std;
6 #define N 9997
7 struct node // 申请一个结构体,用来记录六个胳膊的长度和胳膊长度总和
8 {
9 int num;
10 int s[6];
11 };
12 vector<node>v[N]; // 申请一个 node型的向量数组
13 int find(node a,node b)
14 {
15 int i,j;
16 if(a.num!=b.num) return 0;
17 for(i=0;i<6;i++)
18 {
19 if(a.s[0]==b.s[i])
20 {
21 for(j=1;j<6;j++) // 顺时针查找
22 {
23 if(a.s[j]!=b.s[(j+i)%6]) break;
24 }
25 if(j==6) return 1;
26 for(j=1;j<6;j++) // 逆时针查找
27 {
28 if(a.s[6-j]!=b.s[(i+j)%6]) break;
29 }
30 if(j==6) return 1;
31 }
32 }
33 return 0;
34 }
35 int juge()
36 {
37 int i,j,k;
38 for(i=0;i<N;i++)
39 {
40 for(j=0;j<v[i].size();j++)
41 {
42 for(k=j+1;k<v[i].size();k++)
43 if(find(v[i][j],v[i][k])) return 1; // 如果找到一个就不用再继续找了
44 }
45 }
46 return 0;
47 }
48 int main()
49 {
50 int j,t;
51 node k;
52 cin>>t;
53 while(t--)
54 {
55 k.num=0;
56 for(j=0;j<6;j++)
57 {
58 scanf("%d",&k.s[j]); // 千万不要用cin,用scanf都是勉强挤过的
59 //cin>>k.s[j];
60 k.num+=k.s[j]; // 对六个胳膊求和
61 }
62 v[k.num%N].push_back(k); // 对和取余进行标记,并把k放入到vector中, 
63 }
64 int ans=juge();
65 if(ans) cout<<"Twin snowflakes found.\n";
66 else cout<<"No two snowflakes are alike.\n";
67 return 0;
68 }


 

原文地址:https://www.cnblogs.com/fxh19911107/p/2399709.html