BestCoder Valentine's Day Round

  昨晚在开赛前5分钟注册的,然后比赛刚开始就掉线我就不想说了(蹭网的下场……),只好用手机来看题和提交,代码用电脑打好再拉进手机的(是在傻傻地用手机打了一半后才想到的办法)。

  1001,也就是 hdu 5174,题意很难叙述了,自己看题吧,这题有数据溢出的风险,我竟然是AC了一发才发觉的(只过了小数据),幸好后来改后赶紧再交一遍才不至于被人hack,因为需要对数据去重,我不想用数组模拟,便尝试下用 map了,可是我的奇葩 map ( ~′⌒`~),连我自己都感到无语了:

 1 #include<cstdio>
 2 #include<map>
 3 #include<iostream>
 4 using namespace std;
 5 typedef long long LL;
 6 const int INF= 0x7fffffff;
 7 
 8 typedef map<int,int>::iterator  mit;
 9 
10 mit operator +(const mit &p, int i)
11 {
12     mit it= p;
13     return ++it;
14 }
15 
16 mit operator -(const mit &p, int i)
17 {
18     mit it= p;
19     return --it;
20 }
21 
22 int main(){
23     int n,i,x,k= 0;
24     map<int,int> m;
25     while(~scanf("%d",&n)){
26         m.clear();
27         for(i=1; i<=n; ++i){
28             cin>>x;
29             if(m.find(x)!=m.end())  ++m[x];
30             else    m.insert(pair<int,int>(x,1));
31         }
32         if(m.size()==1) {
33             printf("Case #%d: -1\n",++k);
34             continue;
35         }
36         mit st= m.begin(), it= st, ed= m.end()-1;
37 
38         int ans= 0;
39         for(++it; it!=ed; ++it)
40             if(((LL)it->first+ (it-1)->first)%INF == (it+1)->first)    ans+= it->second;
41 
42         if(((LL)st->first+ ed->first)%INF== (st+1)->first)  ans+= st->second;
43         if(((ed-1)->first+ (LL)ed->first)%INF== st->first)  ans+= ed->second;
44         printf("Case #%d: %d\n",++k,ans);
45     }
46     return 0;
47 }
View Code

  上网找了下,发觉有个做法很不错的,用数组和 map一起模拟,不用什么 insert啊,find啊,还有连迭代器都不用,编码能力确实比我高多了,不得不赞:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <map>
 4 #include <algorithm>
 5 #define INT_MAX 2147483647
 6 using namespace std;
 7 
 8 int main()
 9 {
10     int n, k = 1;
11     long long ans;
12     long long a[1000];
13     while(~scanf("%d", &n))
14     {
15         ans = 0;
16         map<int, int> mm;
17         int cnt = 0, tmp;
18         for(int i = 0; i < n; i++)
19         {
20             scanf("%d", &tmp);
21             if(!mm[tmp])
22             {
23                 a[cnt++] = tmp;
24             }
25             mm[tmp]++;
26         }
27         if(cnt == 1)
28         {
29             printf("Case #%d: -1\n", k++);
30             continue;
31         }
32         sort(a, a+cnt);
33         for(int i = 0 ; i < cnt; i++)
34         {
35             if((a[(i - 1 + cnt) % cnt] + a[(i - 2 + cnt) % cnt]) % INT_MAX == a[i])
36             {
37                 ans += mm[a[(i - 1 + cnt) % cnt]];
38             }
39         }
40         printf("Case #%d: %d\n", k++, ans);
41     }
42     return 0;
43 }
View Code

  1002,hdu 5175,是今天中午才做的,一开始还以为要用到什么高大上的数论定理,后来才发现不过是普通的暴力就行,枚举 n 所有的因数 i 看是否满足  gcd(n, n^i)== i 即可,真正的卡人是在输出格式上:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<algorithm>
 5 using namespace std;
 6 typedef long long LL;
 7 
 8 LL gcd(LL a, LL b)  {  return b==0? a: gcd(b,a%b);  }
 9 
10 LL digit[200000]= {1}, ans[200000];
11 
12 void solve(LL n)
13 {
14     if(n==1){
15         puts("0\n");
16         return;
17     }
18     int num= 0;
19     LL m= sqrt(n+0.5);
20     for(LL i=2; i<=m; ++i)
21         if(n%i==0){
22             digit[++num]= i;
23             if(n/i!=i)  digit[++num]= n/i;
24         }
25     int c= 0;
26     for(int i=0; i<=num; ++i){
27         LL tmp= n^digit[i];
28         if(tmp<n && gcd(n,tmp)==digit[i])   ans[c++]= tmp;
29     }
30     sort(ans,ans+c);
31     printf("%d\n",c);
32     for(int i=0; i<c-1; ++i)
33         printf("%I64d ",ans[i]);
34     if(c)   printf("%I64d\n",ans[c-1]);
35     else    puts("");
36 }
37 
38 int main()
39 {
40     int k=0;
41     LL n;
42     while(~scanf("%I64d",&n)){
43         printf("Case #%d:\n",++k);
44         solve(n);
45     }
46     return 0;
47 }
View Code

  情人节,唉~也算是收到了意料之外的礼物,具体就不说了~~

posted @ 2015-02-15 14:40  Newdawn_ALM  阅读(193)  评论(0编辑  收藏  举报