摩天轮是一个环,周围围绕着一些缆车。每个缆车按顺序编号为1,2,3...K-1,K1,2,3...K−1,K而且每个缆车也拥有一个唯一的值且保证A[i-1] < A[i] < A[i+1](1 < i < K)A[i−1]<A[i]<A[i+1](1<i<K);
Misaki 邀请NN个朋友去做摩天轮,每个朋友都进入一个缆车,如果哪个朋友满足:"(他的缆车的值+左边一个缆车的值)%INT_MAX=右边一个缆车的值",那么可以得到Misaki的一个吻,第1个缆车的左边是第KK个车,右边是第2个车,第KK个车的左边是第k-1k−1个,右边是第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 ",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 ",ca++,ans); } return 0; }