题目大意
一段非重复循环数列,找到所有满足(自身的值+左值)%INT_MAX==右值的值,计算它们的和。
INT_MAX=2147483647
解题思路
①map映射我么可以得到两样东西:关键字key+关键字对应的结果值value,即map(key,value>.key与value是一一对应的关系,类比于结构体
②unique(a,a+n)去重函数,将不重复的元素复制到序列前段,返回去重后最后一个元素的地址,使用前先排序。
③unique(a,a+n)-a返回非重复元素的个数
参考代码+部分解释
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <cstring>
#include <cmath>
#include <climits>
#define eps 1e-8
using namespace std;
typedef long long ll;
const int maxx=INT_MAX;
const int maxn = 1e5+10;
ll a[maxn];
int n;
map<ll,int>mp;
int main()
{
// freopen("input.txt","r",stdin);
int iCase=1;
while(cin>>n){
mp.clear();
for(int i=0;i<n;i++){
cin>>a[i];
mp[a[i]]++;
}
sort(a,a+n);//unique()去重函数使用之前要排序,将不重复的元素复制到序列前段
int size=unique(a,a+n)-a;//返回去重后最后一个元素的地址,减去首地址得到非重复元素个数
//或者int size=mp.size();
if(size==1) {printf("Case #%d: -1\n",iCase++);continue;}
ll ans=0;
for(int i=0;i<size;i++){
if((a[i]+a[(i-1+n)%n])%INT_MAX==a[(i+1)%n]) ans+=mp[a[i]];
}
printf("Case #%d: %lld\n",iCase++,ans);
}
return 0;
}
当然,也可以int size=mp.size()返回非重复元素的个数,但是去重unique()过程必须要有!!
附另一参考程序:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <cstring>
#include <cmath>
#include <climits>
#define eps 1e-8
using namespace std;
typedef long long ll;
const int maxx=INT_MAX;
const int maxn = 1e5+10;
ll a[maxn];
int n;
map<ll,int>mp;
int main()
{
// freopen("input.txt","r",stdin);
int iCase=1;
while(cin>>n){
mp.clear();
for(int i=0;i<n;i++){
cin>>a[i];
mp[a[i]]++;
}
sort(a,a+n);//unique()去重函数使用之前要排序,将不重复的元素复制到序列前段
unique(a,a+n);//返回去重后最后一个元素的地址,减去首地址得到非重复元素个数
int size=mp.size();
if(size==1) {printf("Case #%d: -1\n",iCase++);continue;}
ll ans=0;
for(int i=0;i<size;i++){
if((a[i]+a[(i-1+n)%n])%INT_MAX==a[(i+1)%n]) ans+=mp[a[i]];
}
printf("Case #%d: %lld\n",iCase++,ans);
}
return 0;
}