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;
}

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