SihenZhang 的博客

呀!被你发现了呢!


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

结构体与 sort——CF151B 有感

发表于 2018-10-24 | 评论数:

前言

已经上了 2 个月的大学了,最近也是刷了些题。在做 CF151B 的时候也是有不少想法。于是费了老大劲重启了这个已经被我遗忘的博客,决定写一些东西。

原题(本人翻译)

CF151B Phone Numbers

时空限制: 2000 ms / 256 MB

题目描述

Nvodsk 的冬天刺骨般的冷!于是一行 n 个朋友们会坐出租车,点一个披萨,然后给女生打电话。这个城市中的电话由三组数字组成(如 12-34-56)。每个朋友都有一本大小为 si(此为电话号码的数量)的电话簿。出租车司机的电话号由六个相同的数字构成(如 22-22-22),披萨外卖的电话则由六个递减的数字构成(如 98-73-21),剩下的号码都是女生的电话。
现在你朋友的电话簿都交到了你手里。计算一下当你想做某件事时最好去找谁(有着最多相应类型的电话号码的人)。
如果一个人的电话簿中同一个电话号码出现了两次,你也需要计数两次。也就是说,你需要考虑每个号码出现在电话簿中的次数。

输入输出格式

输入格式:

第一行包含一个整数 n(1≤n≤100) 为朋友的数量。
接下来的 n 组数据用来描述每个朋友的电话簿。每一组数据的格式如下:
第一行包含一个整数 si 和一个字符串 namei(0≤si≤100),用以表示第 i 个朋友的电话簿中的电话号码的数量和第 i 个朋友的名字。名字为一个由大写和小写拉丁字母组成的不超过 20 个字符的非空字符串。接下来的 si 行为形如“XX-XX-XX”的电话号码,其中 X 为 000 到 999 之间的任意数字。

输出格式:

在第一行输出“If you want to call a taxi, you should call: ”。然后输出所有朋友中拥有出租车司机电话号码最多的朋友的名字。
在第二行输出“If you want to order a pizza, you should call: ”。然后输出所有朋友中拥有披萨外卖电话号码最多的朋友的名字。
在第三行输出“If you want to go to a cafe with a wonderful girl, you should call: ”。然后输出所有朋友中拥有女生电话号码最多的朋友的名字。
按照输入数据给出的顺序输出名字。用逗号(,)和空格将两个连续的名字隔开。每一行需要以一个点(.)结束。有关输出格式的说明请看输出样例。必须严格遵守输出格式,不允许有多余的空格。

样例

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
4
2 Fedorov
22-22-22
98-76-54
3 Melnikov
75-19-09
23-45-67
99-99-98
7 Rogulenko
22-22-22
11-11-11
33-33-33
44-44-44
55-55-55
66-66-66
95-43-21
3 Kaluzhin
11-11-11
99-99-99
98-65-32

输出

1
2
3
If you want to call a taxi, you should call: Rogulenko.
If you want to order a pizza, you should call: Fedorov, Rogulenko, Kaluzhin.
If you want to go to a cafe with a wonderful girl, you should call: Melnikov.

输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
3
5 Gleb
66-66-66
55-55-55
01-01-01
65-43-21
12-34-56
3 Serega
55-55-55
87-65-43
65-55-21
5 Melnik
12-42-12
87-73-01
36-04-12
88-12-22
82-11-43

输出

1
2
3
If you want to call a taxi, you should call: Gleb.
If you want to order a pizza, you should call: Gleb, Serega.
If you want to go to a cafe with a wonderful girl, you should call: Melnik.

输入

1
2
3
4
5
6
7
8
9
10
11
3
3 Kulczynski
22-22-22
65-43-21
98-12-00
4 Pachocki
11-11-11
11-11-11
11-11-11
98-76-54
0 Smietanka

输出

1
2
3
If you want to call a taxi, you should call: Pachocki.
If you want to order a pizza, you should call: Kulczynski, Pachocki.
If you want to go to a cafe with a wonderful girl, you should call: Kulczynski.

说明

第一个样例中有四个朋友。Fedorov 的电话簿包含一个出租车司机的电话号码和一个披萨外卖的电话号码,Melnikov 的电话簿只有 3 个女孩的电话号码,而Rogulenko 的电话簿则有 6 个出租车司机的电话号码和一个披萨外卖的电话号码,Kaluzhin 的电话簿有 2 个出租车司机的电话号码和一个披萨外卖的电话号码。
因此,如果你想要打出租车,显然你应该给 Rogulenko 打电话,如果你想要定个披萨,你可以给 Rogulenko、Fedorov、Kaluzhin 中的任何一个打电话(他们每个人都只有一个电话号码)。Melnikov 则有最多的女生的电话号码。

思路

施工中

代码

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <bits/stdc++.h>
using namespace std;

struct phonebook {
char name[21];
int total;
int num;
int taxi = 0;
int pizza = 0;
int girl = 0;
} a[110];

int toNum(char number) {
return number - '0';
}

int isTaxi(char n[]) {
if(toNum(n[0]) == toNum(n[1]) && toNum(n[1]) == toNum(n[3]) && toNum(n[3]) == toNum(n[4]) && toNum(n[4]) == toNum(n[6]) && toNum(n[6]) == toNum(n[7]))
return 1;
else
return 0;
}

int isPizza(char n[]) {
if(toNum(n[0]) > toNum(n[1]) && toNum(n[1]) > toNum(n[3]) && toNum(n[3]) > toNum(n[4]) && toNum(n[4]) > toNum(n[6]) && toNum(n[6]) > toNum(n[7]))
return 1;
else
return 0;
}

bool taxiCmp(phonebook a, phonebook b) {
if(a.taxi == b.taxi)
return a.num < b.num;
else
return a.taxi > b.taxi;
}

bool pizzaCmp(phonebook a, phonebook b) {
if(a.pizza == b.pizza)
return a.num < b.num;
else
return a.pizza > b.pizza;
}

bool girlCmp(phonebook a, phonebook b) {
if(a.girl == b.girl)
return a.num < b.num;
else
return a.girl > b.girl;
}

int main() {
int n;
scanf("%d", &n);
for(int i = 1; i <=n; i++) {
scanf("%d%s", &a[i].total, a[i].name);
a[i].num = i;
for(int j = 1; j <= a[i].total; j++) {
char num[9];
scanf("%s", num);
if(isTaxi(num))
a[i].taxi++;
else if(isPizza(num))
a[i].pizza++;
else
a[i].girl++;
}
}
sort(a + 1, a + n + 1, taxiCmp);
printf("If you want to call a taxi, you should call: ");
for(int i = 1; i <= n && a[i].taxi >= a[1].taxi; i++) {
printf("%s", a[i].name);
if(a[i + 1].taxi < a[i].taxi || i == n)
printf(".\n");
else
printf(", ");
}
sort(a + 1, a + n + 1, pizzaCmp);
printf("If you want to order a pizza, you should call: ");
for(int i = 1; i <= n && a[i].pizza >= a[1].pizza; i++) {
printf("%s", a[i].name);
if(a[i + 1].pizza < a[i].pizza || i == n)
printf(".\n");
else
printf(", ");
}
sort(a + 1, a + n + 1, girlCmp);
printf("If you want to go to a cafe with a wonderful girl, you should call: ");
for(int i = 1; i <= n && a[i].girl >= a[1].girl; i++) {
printf("%s", a[i].name);
if(a[i + 1].girl < a[i].girl || i == n)
printf(".\n");
else
printf(", ");
}
return 0;
}

这只是一篇测试文章

发表于 2018-10-24 | 评论数:

这只是一篇测试文章,用来看一下实际效果。

SihenZhang

SihenZhang

SihenZhang's Blog, just for fun.

2 日志
© 2018 SihenZhang
由 Hexo 强力驱动 v3.8.0
|
主题 – NexT.Gemini v6.4.2