nyoj--86--找球号(一)(hashset二分)
找球號(一)
時間限制:3000 ms ?|? 內存限制:65535 KB 難度:3 描述接下來輸入m+n個整數,前m個分別表示這m個球的編號i,后n個分別表示每次游戲中的隨機整數k
set
常用操作:
1.元素插入:insert()
2.中序遍歷:類似vector遍歷(用迭代器)
3.反向遍歷:利用反向迭代器reverse_iterator。
?? ?例:
?? ?set<int> s;
?? ?......
?? ?set<int>::reverse_iterator rit;
?? ?for(rit=s.rbegin();rit!=s.rend();rit++)
4.元素刪除:與插入一樣,可以高效的刪除,并自動調整使紅黑樹平衡。
?? ??? ??? ?set<int> s;
?? ??? ??? ?s.erase(2);?? ??? ?//刪除鍵值為2的元素
?? ??? ??? ?s.clear();
5.元素檢索:find(),若找到,返回該鍵值迭代器的位置,否則,返回最后一個元素后面一個位置。
?? ??? ??? ?set<int> s;
?? ??? ??? ?set<int>::iterator it;
?? ??? ??? ?it=s.find(5);?? ?//查找鍵值為5的元素
?? ??? ??? ?if(it!=s.end())?? ?//找到
?? ??? ??? ??? ?cout<<*it<<endl;
?? ??? ??? ?else?? ??? ??? ?//未找到
?? ??? ??? ??? ?cout<<"未找到";
6.自定義比較函數
?? ?(1)元素不是結構體:
?? ??? ?例:
?? ??? ?//自定義比較函數myComp,重載“()”操作符
?? ??? ?struct myComp
?? ??? ?{
?? ??? ??? ?bool operator()(const your_type &a,const your_type &b)
?? ??? ??? ?[
?? ??? ??? ??? ?return a.data-b.data>0;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?set<int,myComp>s;
?? ??? ?......
?? ??? ?set<int,myComp>::iterator it;
?? ?(2)如果元素是結構體,可以直接將比較函數寫在結構體內。
?? ??? ?例:
?? ??? ?struct Info
?? ??? ?{
?? ??? ??? ?string name;
?? ??? ??? ?float score;
?? ??? ??? ?//重載“<”操作符,自定義排序規則
?? ??? ??? ?bool operator < (const Info &a) const
?? ??? ??? ?{
?? ??? ??? ??? ?//按score從大到小排列
?? ??? ??? ??? ?return a.score<score;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?set<Info> s;
?? ??? ?......
?? ??? ?set<Info>::iterator it;
//轉載
#include<stdio.h> #include<set> #include<algorithm> using namespace std; int main() {int m,n,a;set<int>s;scanf("%d%d",&m,&n);while(m--){scanf("%d",&a);s.insert(a);}while(n--){scanf("%d",&a);if(s.find(a)!=s.end())printf("YES\n");elseprintf("NO\n");}return 0; }hash #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[10001000]; int main() {int m,n,x;scanf("%d%d",&m,&n);while(m--){scanf("%d",&x);a[x/32]=1<<x%32;}while(n--){scanf("%d",&x);if(a[x/32]&(1<<x%32))printf("YES\n");elseprintf("NO\n");}return 0; }
二分查找 #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[1000100]; int main() {int m,n;scanf("%d%d",&m,&n);for(int i=0;i<m;i++)scanf("%d",&a[i]);sort(a,a+m);while(n--){int mid,k;scanf("%d",&k);int flog=0;int l=0,r=m; while(l<=r){mid=(l+r)/2;if(a[mid]==k){flog=1;break;}else if(k<a[mid])r=mid-1;elsel=mid+1;}if(flog)printf("YES\n");elseprintf("NO\n");}return 0; }
轉載于:https://www.cnblogs.com/playboy307/p/5273737.html
總結
以上是生活随笔為你收集整理的nyoj--86--找球号(一)(hashset二分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript设计模式理论与实战:
- 下一篇: 远程文件下载