hdu 5174 Ferries Wheel

摩天轮是一个环,周围围绕着一些缆车。每个缆车按顺序编号为1,2,3...K-1,K1,2,3...K1,K而且每个缆车也拥有一个唯一的值且保证A[i-1] < A[i] < A[i+1](1 < i < K)A[i1]<A[i]<A[i+1](1<i<K);
	

Misaki 邀请NN个朋友去做摩天轮,每个朋友都进入一个缆车,如果哪个朋友满足:"(他的缆车的值+左边一个缆车的值)%INT_MAX=右边一个缆车的值",那么可以得到Misaki的一个吻,第1个缆车的左边是第KK个车,右边是第2个车,第KK个车的左边是第k-1k1个,右边是第1个.

请帮Misaki计算一下她要吻多少次。你可以假设当所有人进入缆车后,没有空缆车,一个车装有多个朋友也是合法的.
输入描述
多组测试数据
每组测试数据第一行一个NN表示有NN个朋友。
第二行有NN个整数,val[i]val[i]表示第ii个朋友的缆车的值。
1<=n<=1001<=n<=100;
0<=val[i]<=0<=val[i]<= INT_MAX

INT_MAX 为 21474836472147483647
输出描述
对于每组测试数据,输出Case #x: answer; 如果只有一个缆车,输出-1.
输入样例
3
1 2 3
5
1 2 3 5 7
6
2 3 1 2 7 5
输出样例
Case #1: 1
Case #2: 2
Case #3: 3
Hint
对于第三个样例,当他们进入缆车后,缆车的值是{{1},{2}, {3}, {5}, {7}},但第二个缆车有两个朋友,所以答案是3.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <map>
typedef long long LL;
using namespace std;
const int Max=111;
const int MOD=2147483647;
struct node
{
   LL value,num;
   node(int xx,int yy):value(xx),num(yy){}
   node(){}
   bool operator < (const node &another) const
   {
       return value<another.value;
   }
}a[Max];
map<int,int>book;
map<int,int>idx;
int main()
{
    int n,ca=1,x,y;LL sum;
    while(~scanf("%d",&n))
    {
       book.clear();
       idx.clear();
       int top=0,wei;
       for(int i=0;i<n;i++)
       {
           scanf("%d",&x);
           book[x]++;
           if(book[x]==1)
           {
             a[top].value=x;
             a[top].num=1;
             idx[x]=top;
             top++;
           }
           else
           {
             wei=idx[x];
             a[wei].num=book[x];
           }
       }
       if(top==1) {printf("Case #%d: -1\n",ca++);continue;}
       sort(a,a+top);
       int ans=0;
       for(int i=0;i<top;i++)
       {
  //         cout<<a[i].value<<" ";
           if(i==0)
           {
               sum=a[n-1].value+a[0].value;
               if(sum%MOD==a[1].value) ans+=a[0].num;
           }
           else if(i==n-1)
           {
               sum=a[n-2].value+a[n-1].value;
               if(sum%MOD==a[0].value) ans+=a[n-1].num;
           }
           else
           {
               sum=a[i-1].value+a[i].value;
               if(sum%MOD==a[i+1].value) ans+=a[i].num;
           }
       }
       printf("Case #%d: %d\n",ca++,ans);
    }
    return 0;
}
View Code

 

posted @ 2016-04-12 19:55  江南何采莲  阅读(405)  评论(0编辑  收藏  举报