(一)为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量N(N<=100000)和小伙伴的数量M(M<=100000)。
接下来的N行每行包含两个正整数,分别表示该项工作的难度Di(Di<=1000000000)和报酬Pi(Pi<=1000000000)。
接下来的一行包含M个正整数,分别表示M个小伙伴的能力值Ai(Ai<=1000000000)。
保证不存在两项工作的报酬相同。
输出描述:
对于每个小伙伴,在单独的一行输出一个正整数表示他能得到的最高报酬。一个工作可以被多个人选择。
示例1
3 3
1 100
10 1000
1000000000 1001
9 10 1000000000
输出
100
1000
1001
一种思路
找到难度不大于能力的所有工作里,报酬最多的。核心是用HashMap来记录难度和不超过该难度的最大报酬。
先把工作的难度和报酬映射到HashMap
把人的能力也全部读进来,放到HashMap,报酬可以先设为0.
最后按难度从小到大(所以需要先排序)更新HashMap,key为难度,value为不超过难度的最大报酬。
链接:https://www.nowcoder.com/questionTerminal/46e837a4ea9144f5ad2021658cb54c4d?f=discussion
来源:牛客网
import
java.util.*;
public
class
Main{
public
static
void
main(String[] args){
Scanner sc =
new
Scanner(System.in);
int
n = sc.nextInt();
int
m = sc.nextInt();
int
t1=
0
,t2=
0
;
HashMap<Integer,Integer> hs =
new
HashMap<>();
int
[] a =
new
int
[n+m];
int
[] b =
new
int
[m];
for
(
int
i=
0
;i<n;i++){
t1 = sc.nextInt();
t2 = sc.nextInt();
a[i] = t1;
hs.put(t1,t2);
}
for
(
int
i=
0
;i<m;i++){
t1 = sc.nextInt();
a[n+i] = t1;
b[i] = t1;
if
(!hs.containsKey(t1))
hs.put(t1,
0
);
}
Arrays.sort(a);
int
max =
0
;
for
(
int
i=
0
;i<m+n;i++){
max = Math.max(max,hs.get(a[i]));
hs.put(a[i],max);
}
for
(
int
i=
0
;i<m;i++){
System.out.println(hs.get(b[i]));
}
}
}
(二)题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
链接:https://www.nowcoder.com/questionTerminal/0383714a1bb749499050d2e0610418b1?f=discussion
来源:牛客网
示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
输入描述:
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1
输入
3 0 fang 90 yang 50 ning 70
输出
fang 90 ning 70 yang 50
代码
要能够循环输入,否则不通过。
链接:https://www.nowcoder.com/questionTerminal/0383714a1bb749499050d2e0610418b1?f=discussion
来源:牛客网
public
class
Main
{
public
static
void
main(String[] args)
{
Scanner scanner=
new
Scanner(System.in);
while
(scanner.hasNext())
{
int
numPeople=scanner.nextInt();
int
option=scanner.nextInt();
List<Student> stuList=
new
ArrayList<Student>();
for
(
int
i=
0
;i<numPeople;i++)
{
stuList.add(
new
Student(scanner.next(), scanner.nextInt()));
}
//降序
if
(option==
0
)
{
Collections.sort(stuList,
new
Comparator<Student>()
{
public
int
compare(Student o1,Student o2)
{
return
o2.score-o1.score;
}
});
}
else
if
(option==
1
)
//升序
{
Collections.sort(stuList,
new
Comparator<Student>()
{
public
int
compare(Student o1,Student o2)
{
return
o1.score-o2.score;
}
});
}
for
(
int
i=
0
;i<stuList.size();i++)
{
System.out.println(stuList.get(i).name+
" "
+stuList.get(i).score);
}
}
}
}
class
Student
{
public
String name;
public
int
score;
public
Student(String name,
int
score)
{
this
.name=name;
this
.score=score;
}
}
(三)
小Q正在给一条长度为n的道路设计路灯安置方案。
为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用'.'表示, 不需要照亮的障碍物格子用'X'表示。
小Q现在要在道路上设置一些路灯, 对于安置在pos位置的路灯, 这盏路灯可以照亮pos - 1, pos, pos + 1这三个位置。
小Q希望能安置尽量少的路灯照亮所有'.'区域, 希望你能帮他计算一下最少需要多少盏路灯。
输入描述:
输入的第一行包含一个正整数t(1 <= t <= 1000), 表示测试用例数 接下来每两行一个测试数据, 第一行一个正整数n(1 <= n <= 1000),表示道路的长度。 第二行一个字符串s表示道路的构造,只包含'.'和'X'。
输出描述:
对于每个测试用例, 输出一个正整数表示最少需要多少盏路灯。
示例1
输入
2 3 .X. 11 ...XX....XX
输出
输出
1 3