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: 3HintIn the third sample, the order of cable cars is {{1},{2}, {3}, {5}, {7}} after they enter cable car,but the 2nd cable car has 2 friends,so the answer is 3.
/************************************************************************/
附上该题对应的中文题
摩天轮是一个环,周围围绕着一些缆车。每个缆车按顺序编号为1,2,3...K−1,K而且每个缆车也拥有一个唯一的值且保证A[i−1]<A[i]<A[i+1](1<i<K);
Misaki 邀请N个朋友去做摩天轮,每个朋友都进入一个缆车,如果哪个朋友满足:"(他的缆车的值+左边一个缆车的值)%INT_MAX=右边一个缆车的值",那么可以得到Misaki的一个吻,第1个缆车的左边是第K个车,右边是第2个车,第K个车的左边是第k−1个,右边是第1个. 请帮Misaki计算一下她要吻多少次。你可以假设当所有人进入缆车后,没有空缆车,一个车装有多个朋友也是合法的.
多组测试数据 每组测试数据第一行一个N表示有N个朋友。 第二行有N个整数,val[i]表示第i个朋友的缆车的值。 1<=n<=100; 0<=val[i]<= INT_MAX INT_MAX 为 2147483647
对于每组测试数据,输出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
对于第三个样例,当他们进入缆车后,缆车的值是{{1},{2}, {3}, {5}, {7}},但第二个缆车有两个朋友,所以答案是3.
出题人的解题思路:
题意:有 N 个人去做摩天轮,每个人进一个缆车,问有多少人满足:【(他的缆车的值+左边车的值)%INT_MAX=右边缆车的值】. 解法:暴力,记录每个缆车出现的次数,排序去重,枚举缆车的值,判断是否满足那个等式即可。 HACK点:题目没告诉你输入是有重复数的(开始没有样例3,担心被喷得太惨,就加了样例3),只有一个缆车的情况不一定只是 N=1 .有一点稍微提一提,INT_MAX的值是int型的最大值,要对此求余,不用看,缆车本身值+左边车的值必定是会超过int型的,所以中间过程记得转化一下,__int64也好,long long也罢,都是可以的
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #include<math.h> #include<vector> #include<map> #include<set> #include<stdlib.h> #include<cmath> #include<string> #include<algorithm> #include<iostream> #define exp 1e-10 using namespace std; const int N = 105; const int inf = 2147483647; const int mod = 1000000007; int s[N],v[N],t[N]; int main() { int n,i,k,j=1,ans; while(~scanf("%d",&n)) { memset(t,0,sizeof(t)); for(i=0;i<n;i++) scanf("%d",&s[i]); sort(s,s+n); v[0]=s[0];t[0]=1; for(k=0,i=1;i<n;i++) if(s[i]!=s[i-1]) { v[++k]=s[i]; t[k]=1; } else t[k]++; if(!k) printf("Case #%d: -1\n",j++); else { for(ans=i=0;i<=k;i++) if(((__int64)v[i]+v[(i+k)%(k+1)])%INT_MAX==v[(i+1)%(k+1)]) ans+=t[i]; printf("Case #%d: %d\n",j++,ans); } } return 0; }菜鸟成长记