BestCoder #Valentine's Day Round 1001 || hdu 5174

来源:互联网 发布:医疗器械注册 知乎 编辑:程序博客网 时间:2024/06/03 12:53

这里写图片描述

题目大意

一段非重复循环数列,找到所有满足(自身的值+左值)%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-8using 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-8using 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;}
0 0
原创粉丝点击