pair定义

pair可以看作是定义了一个结构体,有两个值,分别为first和second
其标准库类型-定义在#include 头文件中

pair使用场景

pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair
比如:需要将数组的序号和存储的值排序以后分别输出,这个时候就可以用pair更加方便。

初始化

在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同

1
2
3
pair<string, string> word;        // 创建一个空对象anon,两个元素类型都是string
pair<string, int> cnt; // 创建一个空对象 word_count, 两个元素类型分别是string和int类型
pair<string, vector<int> > line; // 创建一个空对象line,两个元素类型分别是string和vector类型

访问

与结构体一样,使用**.属性**来进行访问,两个属性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;
}