STL 習題

sort

題目描述:

STL庫中有許多非常實用的函數,如sort,set,map,vector,queue等。 此題爲sort的應用教學,題目如下: 讀入n條學生成績記錄,包括學生姓名,總成績,語文,數學和英語成績,要求按總成績從高到低輸出n條記錄,每條記錄佔一行。總成績相同時按語文成績從高到低輸出,語文成績相同時按數學成績從高到低輸出。(沒有兩個人的成績完全一樣)

輸入:

第一行讀入一個 n ( 0<n<=100) 接下來n行每行讀入學生姓名,總成績,語文,數學和英語成績,中間以空格隔開

輸出:

n行按要求排序好的記錄。

樣例輸入

3
Lsx 270 90 90 90
Ywz 275 92 93 90
Wjx 255 85 85 85

樣例輸出

Ywz 275 92 93 90
Lsx 270 90 90 90
Wjx 255 85 85 85

代碼:


#include<bits/stdc++.h>
using namespace std;

typedef struct {
​    string name;int tot;int chinese;int math;int english;
} st;

bool  cmp(st a,st b){if(a.tot==b.tot){if(a.chinese>b.chinese){return a.math>b.math;}else return a.chinese>b.chinese;}else return a.tot>b.tot;

}
int main()
{int n;
​    cin>>n;
​    st arr[105];for(int i=0;i<n;i++){
​        cin>>arr[i].name>>arr[i].tot>>arr[i].chinese>>arr[i].math>>arr[i].english;}sort(arr,arr+n,cmp);for(int i=0;i<n;i++){
​        cout<<arr[i].name<<" "<<arr[i].tot<<" "<<arr[i].chinese<<" "<<arr[i].math<<" "<<arr[i].english<<endl;}return 0;
}

vector

題目描述:

Huffman樹在編碼中有着廣泛的應用。 在這裏,我們只關心Huffman樹的構造過程。 給出一列數{pi}={p0, p1, …, pn-1},用這列數構造Huffman樹的過程如下:

  1. 找到{pi}中最小的兩個數,設爲pa和pb,將pa和pb從{pi}中刪除掉,然後將它們的和加入到{pi}中。這個過程的費用記爲pa + pb。
  2. 重複步驟1,直到{pi}中只剩下一個數。 在上面的操作過程中,把所有的費用相加,就得到了構造Huffman樹的總費用。 本題任務:對於給定的一個數列,現在請你求出用該數列構造Huffman樹的總費用。 例如,對於數列{pi}={5, 3, 8, 2, 9},Huffman樹的構造過程如下:
  3. 找到{5, 3, 8, 2, 9}中最小的兩個數,分別是2和3,從{pi}中刪除它們並將和5加入,得到{5, 8, 9, 5},費用爲5。
  4. 找到{5, 8, 9, 5}中最小的兩個數,分別是5和5,從{pi}中刪除它們並將和10加入,得到{8, 9, 10},費用爲10。
  5. 找到{8, 9, 10}中最小的兩個數,分別是8和9,從{pi}中刪除它們並將和17加入,得到{10, 17},費用爲17。
  6. 找到{10, 17}中最小的兩個數,分別是10和17,從{pi}中刪除它們並將和27加入,得到{27},費用爲27。
  7. 現在,數列中只剩下一個數27,構造過程結束,總費用爲5+10+17+27=59。

輸入:

輸入的第一行包含一個正整數n(n<=100)。 接下來是n個正整數,表示p0, p1, …, pn-1,每個數不超過1000。

輸出:

輸出用這些數構造Huffman樹的總費用。

樣例輸入

5
5 3 8 2 9

樣例輸出

59

代碼:


# include <bits/stdc++.h>

# include  <vector>

using namespace std;
vector<int>vec;
bool cmp(int a,int b){
​	return a>b;
}
int main()
{
​	int n;
​	cin>>n;
​	int num,num1,num2,sum=0;
​	for(int i=0;i<n;i++){
​		cin>>num;
​		vec.push_back(num);
​	}
​	while((vec.size()-1)!=0){
​		sort(vec.begin(),vec.end(),cmp);
​		num1=*(vec.end()-1);
​		num2=*(vec.end()-2);
​		vec.pop_back();
​		vec.pop_back();
​		sum+=(num1+num2);
​		vec.push_back(num1+num2);
​	}
​	cout<<sum<<endl;
​	return 0;
}

map

題目描述:

STL庫中有許多非常實用的函數,如sort,set,map,vector,queue等。

此題爲map的應用教學,題目如下:

運動會開始了,1117勢力因爲忙於出題,某些有項目的同學沒有及時趕到檢錄處檢錄,廣播中播放了n次未及時檢錄的同學的名單。

現在,需要聰明的你統計出未及時檢錄的名單及被廣播次數。

輸入:

第一行讀入一個n(1<=n<=100000)

接下來n行每行讀入n個名字

輸出:

分行輸出

每行一個同學的名字和被廣播次數,用空格隔開

樣例輸入

5
zhangning
zhangning
zhangning
hezhong
lihaoyu

樣例輸出

hezhong 1
lihaoyu 1
zhangning 3

代碼:


# include <bits/stdc++.h>

# include <vector>

# include <map>

using namespace std;

map<string,int>mp;
map<string,int>::iterator it;

int main()
{
​	int n,flag;
​	cin>>n;
​	string a;
​	for(int i=0;i<n;i++){
​		flag=0;
​		cin>>a;
​		for(it=mp.begin();it!=mp.end();it++){
​			if(a==it->first) flag=1;
​		}
​		if(flag==1) mp[a]+=1;
​		else mp[a]=1;
​	}
​	for(it=mp.begin();it!=mp.end();it++){
​		cout<<it->first<<" "<<it->second<<endl;
​	}
​	return 0;
}

題目描述:

STL庫中有許多非常實用的函數,如sort,set,map,vector,queue等。

此題爲map的應用教學,題目如下:

運動會又開始了,acm俱樂部的出題組成員因要忙着出題,便向教主申請了請假,教主寫下了請假名單。

某成員想知道自己是否在請假名單中,請通過map進行解答,如果有請輸出YES,否則輸出NO

輸入:

第一行 包括整數n(名單人數,可能有重複)

第二行 請假名單

第三行 要查詢的人員的名字

輸出:

輸出YES或者NO

樣例輸入

5
hz hz  zn lhy zgc
hz

樣例輸出

YES

代碼:


# include<bits/stdc++.h>

# include<map>

using namespace std;
map<string,int>mp;
int main()
{
​	int n;
​	cin>>n;
​	string a;
​	for(int i=0;i<n;i++){
​		cin>>a;
​		mp[a]=1;
​	}
​	cin>>a;
​	if(mp.count(a)){
​		cout<<"YES"<<endl;
​	}
​	else{
​		cout<<"NO"<<endl;
​	}
​	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章