文章目录
1、模型文件去重
- 【题目描述】
抖音上不同的用户类型我们有不同的用户模型文件。
我们有一个模型配置文件,里面有很多的不同的用户类型和他们对应的模型文件。我们需要找出每个模型对应的是哪些用户类型。
给定一行输入,格式是a b
a表示这个用户的用户类型,b表示这个用户对应的模型文件。
请你输出每个模型文件对应的用户类型。
注意1:每个模型文件可能对应多个用户类型,用户类型之间用空格作为切分。
注意2: 如果有多个用户类型输出,用户类型之间的排序按照字母表排序。
注意3: 如果有多个模型输出,模型输出的顺序按照模型文件在输入数据中顺序,即从上到下。
-
【输入描述】
输入第1行: 用户类型 N(表示有多少个 用户类型)
接下来的N行:用户类型 模型文件 -
【输出描述】
模型文件用户类型1 用户类型2 -
【示例1】
//输入
1
abc 1.txt
//输出
1.txt abc
- 【示例2】
//输入
5
abc 1.txt
aaa 2.txt
ccc 2.txt
bbb 2.txt
ddd 1.txt
//输出
1.txt abc ddd
2.txt aaa bbb ccc
- 【解题思路】
用一个map做hash,其中以string作为key,字符串去重集合set<string>
作为value。
- 【参考代码1】
#include<iostream>
#include<vector>
#include<set>
#include<unordered_map>
using namespace std;
int main()
{
int n;
string a, b;
vector<string> vct;
unordered_map<string, set<string>> unod_map;
cin >> n;
while (n--)
{
cin >> a >> b;
if (!unod_map.count(b))
{
vct.push_back(b);
}
unod_map[b].insert(a);
}
for (auto b:vct)
{
cout << b;
for (auto a:unod_map[b])
{
cout << " " << a;
}
cout << endl;
}
return 0;
}
/****
5
abc 1.txt
aaa 2.txt
ccc 2.txt
bbb 2.txt
ddd 1.txt
***/
2、穿越沙漠的补给次数
- 【题目描述】旅行者穿越沙漠的过程中需要不断地消耗携带的饮用水,到达终点前会经过几个绿洲,每个绿洲均设有水分补给站可以为旅行者提供水分补给并收取一定的费用。
沿途共有n个补给站,每个补给站收取的费用都一样,但是提供的水量不尽相同。起点到终点的距离为D公里,postion[i]表示第i个补给站距离起点的距离,单位为公里,supply[i]表示第i 个补给站可以提供的水量,单位为升。
假设旅行者在起点时携带了W升的水,每行走1公里需要消耗1升的水量,身上可携带的水量没有上限,且携带的水量多少不会对体能消耗产生影响,鉴于每次进补给站花费的钱都是一样多,期望用最少的补给次数到达终点,请帮忙计算最少的补给次数。
- 【输入描述】
第一行输入整数D和W, D表示起点到终点的距离,W表示初始携带的水量
第二行输入数组postion,长度为N,分别表示N个补给站分别距离起点的距离
第三行输入数组supply,长度为N, 分别表示N个补给站分别可以供给的水量
数据范围:1 <= D, W<=10^8, 0<=N<=1000, 0<position[i],supply[i]<D
- 【输出描述】
输出一个整数表示最少的补给次数,若无法到达终点则返回-1
- 【示例1】
//输入
10 4
1 4 7
6 3 5
//输出
1
- 【说明】
每行输入用空格隔开。起点到终点共10公里,初始时携带4升水,途径3个补给站。共需补给一次:只需在第1个补给站补给一次获得6升水,即可走完全程
- 【解题思路】
贪心。假设你现在有携带的水量为W,当前位置为curPos,那么你携带的水能够支撑你走到curPos+W位置,走到该位置之后你再考虑去该位置(如果有)及之前的水站加水(可能在该位置之前有多个水站),此外,为了保证最少的加水次数,应该到能加到最多水的水站加水,而且加完水之后应该给这个水站加一个标记(used数组),以后不能再到该水站取水。
- 【参考代码】
#include<iostream>
#include<vector>
#include<