pair定义
pair可以看作是定义了一个结构体,有两个值,分别为first和second
其标准库类型-定义在#include 头文件中
pair使用场景
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair
比如:需要将数组的序号和存储的值排序以后分别输出,这个时候就可以用pair更加方便。
初始化
在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同
1 2 3
| pair<string, string> word; pair<string, int> cnt; pair<string, vector<int> > line;
|
访问
与结构体一样,使用**.属性**来进行访问,两个属性first和second
1 2 3 4 5
| p1.first = 5; p1.second = 6;
|
演示
排队接水
题目描述
有 $n$ 个人在一个水龙头前排队接水,假如每个人接水的时间为 $T_i$,请编程找出这 $n$ 个人排队的一种顺序,使得 $n$ 个人的平均等待时间最小。
输入格式
第一行为一个整数 $n$。
第二行 $n$ 个整数,第 $i$ 个整数 $T_i$ 表示第 $i$ 个人的接水时间 $T_i$。
输出格式
输出文件有两行,第一行为一种平均时间最短的排队顺序;第二行为这种排列方案下的平均等待时间(输出结果精确到小数点后两位)。
样例 #1
样例输入 #1
1 2
| 10 56 12 1 99 1000 234 33 55 99 812
|
样例输出 #1
1 2
| 3 2 7 8 1 4 9 6 10 5 291.90
|
提示
$1\le n \leq 1000$,$1\le t_i \leq 10^6$,不保证 $t_i$ 不重复。
思路都是用来存序号和等待打水的时间,pair里存的是first和second,第一个未使用的是struct
未使用pair使用结构体
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include<bits/stdc++.h> using namespace std; int n,ans=0; struct water{ int time; int num; }; bool compare(water a,water b) { return a.time<b.time; } int main() { cin>>n; water a[10000]; for(int i=1; i<=n; i++) { cin>>a[i].time; a[i].num=i; } sort(a+1,a+n+1,compare); for(int i=1; i<=n; i++) { cout<<a[i].num<<" "; } cout << endl; double wait_time=0.0; double sum=0.0; for(int i=1;i<=n;i++){ sum+=wait_time; wait_time+=a[i].time; } cout << fixed << setprecision(2) << sum/n << endl; return 0; }
|
用pair以后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <iostream> #include <algorithm> #include <iomanip> #include <utility>
using namespace std;
bool compare(pair<int, int> a, pair<int, int> b) { return a.second < b.second; }
int main() { int n; cin >> n;
pair<int, int> times[n]; for (int i = 0; i < n; ++i) { cin >> times[i].second; times[i].first = i + 1; }
sort(times, times + n, compare);
double total_wait_time = 0.0; double current_wait_time = 0.0;
for (int i = 0; i < n; ++i) { cout << times[i].first << " "; total_wait_time += current_wait_time; current_wait_time += times[i].second; } cout << endl;
double average_wait_time = total_wait_time / n; cout << fixed << setprecision(2) << average_wait_time << endl;
return 0; }
|
评论