题意:有
N
个人去做摩天轮,每个人进一个缆车,问有多少人满足:【(他的缆车的值+左边车的值)%INT_MAX=右边缆车的值】.
解法:暴力,记录每个缆车出现的次数,排序去重,枚举缆车的值,判断是否满足那个等式即可。
当时相当2,已经想到了正确的解法,暴力去重竟然不会了。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#define ll __int64
using namespace std;
const ll INF=2147483647;
int main()
{
map<ll,int> M;
int n;
int ii=1;
while(cin>>n)
{
ll a,ans=0;
M.clear();
for(int i=0; i<n; i++)
{
cin>>a;
M[a]++;
}
if(M.size()==1)
{
printf("Case #%d: %d\n",ii++,-1);
continue;
}
map<ll,int >::iterator l,mid,r;
ll x,y,z;
l=M.end();
l--;
mid=r=M.begin();
r++;
for(int i=0; i<M.size(); i++)
{
if(l==M.end()) l=M.begin();
if(r==M.end()) r=M.begin();
if(mid==M.end()) mid=M.begin();
x=(*l).first;
y=(*mid).first;
z=(*r).first;
if((x+y)%INF==z) ans+=(*mid).second;
l++;
mid++;
r++;
}
printf("Case #%d: %d\n",ii++,ans);
}
return 0;
}