牛客网题目(一)


(一)为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。

输入描述:



每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量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

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值