程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva 11386 Triples (hash總是wa,於是模擬STL)

uva 11386 Triples (hash總是wa,於是模擬STL)

編輯:C++入門知識

uva 11386 Triples 這題 應該用 hash , 用 STL map超時,但是我自己手寫二分,再加一些優化,限時8秒,我7.8秒卡過,很爽!

這題彈了很多遍,注意的是,ans 用int 不夠,最後直接改為long long  就過了,因為這題數據沒說范圍,只說了是正整數,所以有點不爽啊。。。但是,ans可以算出來絕對超過 int 的 ,因為最多5000個數,如果有1000個1  1000個2  3000個3 答案就是  3e9 超過int 了


 

#include <iostream>  
#include <cstdio>   
#include <map>  
#include <vector>  
#include <algorithm>  
using namespace std; 
 
const int maxn=5010; 
long long a[maxn],n; 
map <long long,int> mp; 
map <long long,int>::iterator it; 
vector <long long> v; 
vector <int> cnt; 
 
int binaryS(int left,int c){ 
    int l=left,r=v.size()-1; 
    while(l<r){ 
        int mid=(l+r)/2; 
        if(v[mid]>=c) r=mid;  
        else l=mid+1; 
    } 
    return r; 
} 
 
int main(){ 
    while(scanf("%d",&n)!=EOF){ 
        long long int ans=0; 
        mp.clear();v.clear();cnt.clear(); 
        for(int i=0;i<n;i++){ 
            scanf("%lld",&a[i]); 
            mp[a[i]]++; 
        } 
        for(it=mp.begin();it!=mp.end();it++){ 
            v.push_back(it->first); 
            cnt.push_back(it->second); 
        } 
        sort(a,a+n); 
        for(int i=0;i<n;i++){ 
            int left=0; 
            for(int j=i+1;j<n;j++){ 
                long long sum=a[i]+a[j]; 
                int pos=binaryS(left,sum); 
                if(v[pos]!=sum) continue; 
                ans+=cnt[pos]; 
                left=max(pos-1,left); 
            } 
        } 
        cout<<ans<<endl; 
    } 
    return 0; 
}  

#include <iostream>
#include <cstdio>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

const int maxn=5010;
long long a[maxn],n;
map <long long,int> mp;
map <long long,int>::iterator it;
vector <long long> v;
vector <int> cnt;

int binaryS(int left,int c){
 int l=left,r=v.size()-1;
 while(l<r){
  int mid=(l+r)/2;
  if(v[mid]>=c) r=mid;
  else l=mid+1;
 }
 return r;
}

int main(){
 while(scanf("%d",&n)!=EOF){
  long long int ans=0;
  mp.clear();v.clear();cnt.clear();
  for(int i=0;i<n;i++){
   scanf("%lld",&a[i]);
   mp[a[i]]++;
  }
  for(it=mp.begin();it!=mp.end();it++){
   v.push_back(it->first);
   cnt.push_back(it->second);
  }
  sort(a,a+n);
  for(int i=0;i<n;i++){
   int left=0;
   for(int j=i+1;j<n;j++){
    long long sum=a[i]+a[j];
    int pos=binaryS(left,sum);
    if(v[pos]!=sum) continue;
    ans+=cnt[pos];
    left=max(pos-1,left);
   }
  }
  cout<<ans<<endl;
 }
 return 0;
}

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved