首页 > 试题广场 >

牛牛找工作

[编程题]牛牛找工作
  • 热度指数:132683 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。

输入描述:
每个输入包含一个测试用例。
每个测试用例的第一行包含两个正整数,分别表示工作的数量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
直接使用TreeMap即可.
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
       while(sc.hasNext()){
           int n=sc.nextInt(); 
           int m=sc.nextInt();
           TreeMap<Integer,Integer> map=new TreeMap<>();
           for(int i=0;i<n;i++){
              map.put(sc.nextInt(),sc.nextInt());
           }
           
           int value=0;
           for(int key:map.keySet()) {
                if(map.get(key)<value)
                    map.put(key, value);
                value=map.get(key);
	    	}
     
           for(int i=0;i<m;i++){
               int ai=sc.nextInt();
               if(map.floorKey(ai)!=null)
                   System.out.println(map.get(map.floorKey(ai)));
               else
                   System.out.println(0);
           }
       }
        sc.close();
    }
}


发表于 2021-03-13 21:39:55 回复(1)
利用TreeMap自动对key进行排序的特点
1.用TreeMap保存难度与报酬,并将小伙伴的能力也保存进去(key为能力值,val先设置为-1)
2.新建一个数组arr,保存小伙伴的顺序
3.遍历TreeMap,将当前难度对应的报酬替换为不超过此难度的最大报酬
4.根据arr保存的顺序,依次从treemap中输出结果
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            int N = sc.nextInt();
            int M = sc.nextInt();
            //记录难度与报酬的对应关系
            TreeMap treeMap = new TreeMap<Integer,Integer>();
            for(int i = 0; i < N; i++) {
                treeMap.put(sc.nextInt(),sc.nextInt());
            }
            //记录M个小伙伴顺序
            int[] arr = new int[M];
            for(int i = 0; i < M; i++) {
                Integer temp = sc.nextInt();
                if(!treeMap.containsKey(temp)) {
                    //将小伙伴的能力也保存进去
                    treeMap.put(temp,-1);
                }
                arr[i] = temp;
            }
            //记录当前难度最大的报酬
            int max = 0;
            Iterator iter = treeMap.entrySet().iterator();
            while(iter.hasNext()) {
                Map.Entry entry = (Map.Entry)iter.next();
                max = Math.max(max,(Integer)entry.getValue());
                treeMap.put((Integer)entry.getKey(),max);
            }
            for(int i = 0; i < M; i++) {
                System.out.println(treeMap.get(arr[i]));
            }
        }
    }
}



编辑于 2020-05-02 20:57:05 回复(0)
我练习的时候,每次报错都是没有输入输出数据,但是我自己自测调试的时候根本不能不输入数据,这个是怎么回事
发表于 2020-03-15 17:39:18 回复(0)


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();
        TreeMap<Integer,Integer> map=new TreeMap<>();
        int a=0;
        int b=0;
        int t[]=new int[n];
        int t1[]=new int[m];
        int max=0;
        for(int i=0;i<n;i++){
            a=sc.nextInt();
            b=sc.nextInt();
            t[i]=a;
            map.put(a,b);
        }
        Arrays.sort(t);
        for(int i=1;i<n;i++){
            max=Math.max(map.get(t[i]),map.get(t[i-1]));
            map.put(t[i],max);
        }
        for(int i=0;i<m;i++){
            t1[i]=sc.nextInt();
        }
        for(int i=0;i<m;i++){
            Integer index=map.floorKey(t1[i]);
            if(index != null) {
                System.out.println(map.get(index));
            } else {
                System.out.println(0);
            }
        }
    }
}
发表于 2020-02-18 15:47:47 回复(0)
TreeMap具有对key的排序性质
map1用于存储每种工作难度对应的最高报酬,因为可能相同的报酬对应的报酬不一样。
map1的键值(工作难度Di)是排好序的。
map2是存储只要有报酬比当前map2中报酬高的工作entry。map2初始值是map1的第一条entry。
最后读取伙伴们的能力值去找floorEntry(friendKey)。

import java.util.Scanner;
import java.util.TreeMap;
import java.util.Map;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int M = sc.nextInt();
        TreeMap<Integer, Integer> map1 = new TreeMap();
        for(int i = 0; i<N; i++) {
            int Di = sc.nextInt();
            int Pi = sc.nextInt();
            if(map1.containsKey(Di)) {
                if (Pi > map1.get(Di)) {
                    map1.put(Di, Pi);
                }
            }else {
                map1.put(Di, Pi);
            }
        }
        TreeMap<Integer, Integer> map2 = new TreeMap();
        Map.Entry<Integer, Integer> firstEntry = map1.firstEntry();
        map2.put(firstEntry.getKey(), firstEntry.getValue());
        for (Map.Entry<Integer, Integer> entry:map1.entrySet()) {
            if (entry.getValue() > firstEntry.getValue()) {
                map2.put(entry.getKey(), entry.getValue());
                firstEntry = entry;
            }
        }
        for (int i = 0; i<M; i++) {
            int friendKey = sc.nextInt();
            Map.Entry<Integer, Integer> floorEntry = map2.floorEntry(friendKey);
            if (floorEntry != null){
                System.out.println(floorEntry.getValue());
            }else {
                System.out.println(0);
            }
        }
    }
}

发表于 2019-09-27 22:28:41 回复(0)
这个用例是不是有问题?

用例:
1000 1000 787000 48080 261688 160559 246542 653205 182462 270339 437198 88255 402273 412550 463665 4218 235858 342063 375285 441618 837203 728492 229395 630747 714734 921585 21232 649897 232625 739160 398941 961393 689889 740372 628207 957783 483868 592844 895223 682757 534285 908366 762675 648235 489467 436674 429740 677769 564747 390179 779494 137135 639874 829642 972498 281318 826684 184554 308239 141292 755936 288772 778437 754043 35561 565860 427841 88930 33302 162147 20964 924203 294618 340028 907140 439556 599518 183607 575145 277534 262346 713568 467217 96817 841584 413473 200869 827582 18433 377980 640794 647371 37357 952714 11944 897027 85472 385303 397558 545675 687807 886507 502428 533318 598519 934450 185424 124850 301183 300869 646186 284233 96425 542839 544536 308777 876109 222449 983595 842972 82694 60719 520687 559960 840378 106928 800959 598792 31814 319266 604327 817089 998048 237812 68824 812030 734124 443914 987279 823901 548143 587828 465854 560504 147135 725983 801378 991741 791305 154419 11076 288375 34097 410707 532096 653498 307334 438744 161897 914634 914700 407935 263570 775325 973376 302638 134278 377348 374255 465083 393538 737574 907391 460237 8454 891605 717476 190608 646823 672591 482181 184382 356864 509223 667124 985801 180508 322577 430178 93874 494022 516770 925785 537109 207025 907453 700455 481874 428768 300199 271586 754469 332415 912420 99374 952767 635440 604407 120833 553243 568568 263287 997592 976418 704663 231636 228871 964472 584636 805406 121549 526108 352982 996494 103413 982972 650811 549627 188334 630326 599189 734359 328636 445736 578048 318535 922853 478402 323422 251167 891972 511727 742156 829707 769546 275759 129258 800583 45584 904272 481502 30040 373863 345160 366041 258256 179544 165324 426201 190150 756212 918652 374750 678988 66077 755629 829117 538240 330970 70510 895087 161755 878047 143820 656051 513581 77435 208022 550816 407647 830593 982441 222748 237455 329224 774357 856848 895119 654987 822350 214314 701711 412905 200660 401577 820862 923965 51347 628988 773397 890255 913380 95044 116429 850290 913130 718333 147020 353964 55670 807657 700564 680913 991299 543165 818475 749352 654875 222666 577764 258469 609385 614422 802844 244077 876236 944416 160142 885973 316866 136879 838256 322387 270147 748212 982060 654619 670649 952163 875752 877292 176319 821950 336918 538872 642087 333698 550540 777352 208810 481912 363253 30030 567309 843877 365471 492545 802190 348626 387371 623388 457851 431157 701752 195127 557795 596966 238904 58036 877754 999620 761657 314659 315433 431013 194678 268719 192356 791601 56011 406175 812339 567848 690036 394398 583458 732951 111895 245507 915177 876184 500941 889882 919348 907038 178134 692617 342228 465997 285834 910692 846436 882168 718696 711921 137861 557248 2194 582317 351347 573284 881327 547157 922557 498356 384409 158382 929017 961533 911036 510013 766237 176984 187397 124511 608487 643123 237264 149155 505199 867374 602337 211819 41071 241351 41516 732087 153602 39207 568437 809378 681146 879306 879313 192787 147640 674467 115586 283941 261785 130126 253431 375263 827563 745236 449130 846412 739548 800859 695464 518884 847842 856323 589821 344338 310884 101866 410309 425780 955504 29592 389988 428766 589691 830308 828175 718631 710917 413829 709865 40651 84178 688082 473535 313535 882658 693067 204684 193408 680425 689382 983829 599332 15680 178915 726006 541479 118250 332791 122724 455008 592032 136189 39585 999962 635837 928848 887739 419179 451331 349475 606693 389472 821764 234442 828884 947031 172714 54222 990987 685403 183400 469908 221144 881180 345078 424142 877301 418164 776929 728056 320719 869860 655800 511933 248578 770597 996056 527568 297980 905999 130442 265284 92134 139213 976496 216324 653630 749334 480003 171059 958279 992454 617368 687269 842807 395419 950790 802540 827424 744625 516529 929973 836176 331878 192042 762376 360170 302615 999669 363259 448186 703809 820730 330520 145868 945065 437405 698234 204078 575340 510950 77324 645257 636231 965609 804450 428836 630961 396718 440334 671785 133780 419275 189004 582055 889152 563837 42919 333710 842648 52379 554330 118870 190483 743987 326599 284960 150140 13907 665291 585683 897634 351593 882376 433928 752024 363019 830050 413862 616102 333617 547131 657104 820631 948077 686231 854002 440689 281186 190648 513168 950409 947810 838571 698550 125436 510694 423786 718857 413094 823106 413000 285213 572647 169358 852959 628452 396737 260111 460053 148902 843987 792620 946619 186019 418793 415393 139045 797211 798882 472935 126733 627662 338528 397130 334160 196740 884308 342874 404959 269855 307808 907883 691016 639588 839427 54517 98434 381374 705192 558316 238292 66354 110375 726480 149870 969788 696570 820599 492063 242329 630433 418550 690726 19627 871719 424964 10352 5728 763283 617007 901920 843170 490169 385573 798075 903881 554174 941492 653544 461085 198527 243146 92750 518236 369714 630102 213877 173282 271811 475685 233443 101084 213504 711646 570793 882412 260846 974247 987092 132720 370466 21422 235781 31099 305057 66360 718065 181242 422936 151093 859881 19897 547565 682730 567027 935180 957996 688469 648943 513757 606818 77797 771035 671820 981334 629456 303488 95523 65155 607835 768402 737310 234576 932525 37108 506321 408896 69276 746722 194978 833914 386207 750725 359434 504210 860114 590339 904968 57134 932718 280292 386086 622441 241390 361766 863802 212780 70827 112746 618006 535976 729432 937924 60705 962949 806182 859247 90436 375263 202274 866471 581774 493155 968642 437669 633008 741518 143196 473287 622234 237655 546135 84997 42756 13984 663376 643180 741605 573849 9990 69119 259136 228556 670127 766218 262729 850538 17569 101997 457357 631117 817921 910511 294167 26092 64055 185456 609012 779394 285487 144085 675760 217239 795322 421512 576175 701293 192212 178510 449493 877932 110796 327776 283958 394991 837622 840458 350591 506214 23012 316006 430378 215266 723865 327266 205078 902539 531485 104446 440221 521893 886652 380871 262413 566110 94566 730447 772063 381906 755272 301067 819811 22504 118706 725035 264210 592530 559776 893134 948346 459929 199457 902539 682485 855438 39674 179472 803042 211698 535356 228383 429795 487687 696970 876325 967974 234485 475468 138721 495829 974206 968318 571779 996053 822186 392106 719298 164010 303268 242290 583956 600738 852251 234463 878475 35205 824442 573533 453250 191516 960848 166708 900628 960047 582296 85568 408581 222077 23587 123314 856711 223191 174961 527190 631958 275333 408220 980459 845652 327793 853685 216253 342183 699823 677436 502742 177614 699755 313469 445241 978639 857034 469189 359198 153924 569832 93929 36497 672321 380737 653864 68242 241104 358792 903556 280414 734069 337611 361765 242613 791498 247676 724645 120370 824988 715041 311053 229623 816836 193662 129631 928750 204991 906750 515306 435632 97631 177230 156337 685650 981448 640122 690308 728003 503971 148885 624989 924600 522655 244533 579293 922032 166387 734860 243629 50728 231165 578753 48821 254280 964174 726909 467584 445860 193811 824735 416326 97900 230261 783633 59728 248541 726642 50712 88368 135966 23353
发表于 2019-09-13 03:38:13 回复(1)
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
     public static void main(String[] args) {
    	 Scanner sc=new Scanner(System.in);
    	 int n=sc.nextInt();
    	 int m=sc.nextInt();
    	 long d[][]=new long[n][2];
    	 for(int i=0;i<n;i++) {
    		 d[i][0]=sc.nextLong();
    		 d[i][1]=sc.nextLong(); 
    	 }
    	 long p[]=new long[m];
    	 for(int i=0;i<m;i++) {
    		 p[i]=sc.nextInt();
    	 } 
    	 long s[]=new long[m];
    	 Arrays.sort(d, new Comparator<long[]>() { @Override public int compare(long[] o1, long[] o2) {
				// TODO Auto-generated method stub
				return (int) (o2[1]-o1[1]);
			}
		});   
    	 
    	 for(int i=0;i<m;i++) {
    		 for(int j=0;j<n;j++) {
    			 if(p[i]>=d[j][0]) {
    				 s[i]=d[j][1];
    				 break;
    			 }
    		 }
    		 System.out.println(s[i]);
    	 } 	 
	}

}
复杂度过大,只通过80%,求改进建议。。。。。。。。。
编辑于 2019-09-10 13:10:11 回复(0)
import java.util.*;

public class Main {
     public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n, m;
        int[] a;

        List<int[]> dps = new ArrayList<>();

        n = in.nextInt();
        m = in.nextInt();

        a = new int[m];
        for(int i = 0; i < n; i++){
            int d = in.nextInt();
            int p = in.nextInt();
            dps.add( new int[]{d, p} );
        }
        for(int i = 0; i < m; i++){
            a[i] = in.nextInt();
        }

        /**
         * 1. 构造集合dps,dps[i] = int[]{d,p}, 难度d, 对应的最大报酬p
         * 2. 对于每一个输入的能力值,使用二分法查找对应的最大报酬
         */
        dps.sort(Comparator.comparingInt(o -> o[0]));
        int max = 0;
        for(int i=0; i<n; i++){
            int[] pair = dps.get(i);
            //最大报酬
            if(pair[1] > max){
                max = pair[1];
            }
            pair[1] = max;
            dps.set(i, pair);
        }

        for(int i=0; i<m; i++){
            int[] pair = new int[2];
            pair[0] = a[i];
            //不存在时返回 -(insertion point) - 1 , insertion point 是插入位置
            int index = Collections.binarySearch(dps, pair, Comparator.comparingInt(o -> o[0]));
            if(index < 0){
                index++;
                index = -index;
                index--;
                
                //index = -index-2;
            }
            if(index < 0){
                System.out.println(0);
            }else{
                System.out.println(dps.get(index)[1]);
            }
        }

    }
}

发表于 2019-09-09 11:37:04 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args)
    {
        Scanner read=new Scanner(System.in);
        int N,M;
        N=read.nextInt();
        M=read.nextInt();
        int[] difficulty=new int[N];
        int[] pay=new int[N];
        int[] powr=new int[M];
        for(int i=0;i<N;i++)
        {
            difficulty[i]=read.nextInt();
            pay[i]=read.nextInt();
        }
        for(int i=0;i<M;i++)
        {
            powr[i]=read.nextInt();
        }
        for(int i=N-1;i>0;i--)
        {
            int a,b;
            for(int j=i-1;j>=0;j--)
            {
                if(difficulty[i]<difficulty[j])
                {
                    a=difficulty[i];
                    difficulty[i]=difficulty[j];
                    difficulty[j]=a;
                    b=pay[i];
                    pay[i]=pay[j];
                    pay[j]=b;
                }
            }
        }
        for(int i=0;i<M;i++)
        {
            for(int j=N-1;j>=0;j--)
            {
                if(powr[i]>=difficulty[j])
                {
                    int a1=pay[j];
                    for(int i1=j-1;i1>=0;i1--)
                    {
                        if(a1<pay[i1])
                        {
                            a1=pay[i1];
                        }
                    }
                    System.out.println(a1);
                    break;
                }
            }
        }
    }
}
只有30%的通过率,为什么
发表于 2019-08-26 18:06:43 回复(0)
先把各个工作难度的对应值放入Hashmap中
再将工作难度排序
从前往后扫描一次,找出每个难度对应的薪酬的max值存入数组
最后二分法查找,总的时间复杂度O(mlgn)
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main04 {
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in );
        int N = in.nextInt();
        int M = in.nextInt();
        int[] di= new int[N];
        int[] pi = new int[N];
        int[] ai=new int[M] ;
        for(int n=0;n<N;n++) {
            di[n] = in.nextInt();
            pi[n] = in.nextInt();
        }
        for(int m=0;m<M;m++) {
            ai[m]=in.nextInt();
        }
        HashMap<Integer, Integer> map=new HashMap<Integer, Integer>();
        for(int n=0;n<N;n++) {
            map.put(di[n], pi[n]);
        }
        Arrays.sort(di);
        int[] maxPay = new int[N];
        maxPay[0]=map.get(di[0]);
        for(int i=1;i<N;i++) {
            if(map.get(di[i])>maxPay[i-1]) {
                maxPay[i]=map.get(di[i]);
            }else {
                maxPay[i]=maxPay[i-1];
            }
        }
        int[] max = new int[M];
        for(int m=0;m<M;m++) {
            int small=0;
            int big = N-1;
            while(small<big) {
                if((big-small)==1) break;
                int mid = (small+big)/2;
                if(ai[m]>=di[mid]) {
                    small=mid;
                }else {
                    big=mid;
                }
            }
            if(ai[m]>=di[big]) { 
                max[m]=maxPay[big];
            }else if(ai[m]<di[small]) {
                max[m]=0;
            }else {
                max[m]=maxPay[small];
            }
            
        }
        for(int m:max) {
            System.out.println(m);
        }
        in.close();
    }
}

发表于 2019-08-15 23:35:09 回复(0)
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        int n = 0;//工作
        int m = 0;//人
        Map work = new HashMap();

        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();

        int[] people = new int[m];
        int[] pay = new int[m];

        for (int i = 0; i < n; i++) {
            int diff = scanner.nextInt();//难度
            int salary = scanner.nextInt();//报酬
            work.put(salary, diff);
        }

        for (int k = 0; k < m; k++) {
            final int tmp = scanner.nextInt();
            people[k] = tmp;

            Object obj = work.entrySet().stream().filter(entry -> (int) ((HashMap.Entry) entry).getValue() <= tmp).sorted((o1, o2) -> {
                if ((int) ((HashMap.Entry) o1).getKey() > (int) ((HashMap.Entry) o2).getKey()) {
                    return -1;
                } else {
                    return 1;
                }
            }).findFirst().get();

            pay[k] = (int) ((HashMap.Entry) obj).getKey();
        }

        for (int a : pay) {
            System.out.println(a);
        }
    }
}
 
IDEA 里我测试这没啥问题啊,为啥不给我过?
发表于 2019-08-08 16:13:22 回复(0)
Java解答:参考了前几个大佬的写法,感觉自己还是要多练练。自己没事看看,加强一下学习。
import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int N = input.nextInt();
        int M = input.nextInt();
        int i = 0;
        int[][] DP = new int[N][2];
        for (i = 0;i<N;i++){
            DP[i][0] = input.nextInt();
            DP[i][1] = input.nextInt();
        }
        TreeMap map = new TreeMap();
        //把DP按照第一列排序。
        Arrays.sort(DP,(e1,e2) ->(int)(e1[0] - e2[0]));
        for (i = 1; i<DP.length;i++){
            DP[i][1] = Math.max(DP[i-1][1], DP[i][1]);
            //更新每个难度值对应的报酬为不高于其难度值的所有报酬中最高的报酬。
        }
        for (i = 0; i < DP.length;i++){
            map.put(DP[i][0],DP[i][1]);
        }
        for (i = 0;i<M;i++){
            int ability = input.nextInt();
            Integer index = (Integer) map.floorKey(ability);
            if (index != null)
                System.out.println(map.get(index));
            else
                System.out.println(0);
        }
    }
}


发表于 2019-08-06 16:28:02 回复(0)
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in); int n = sc.nextInt();//工作量  int m = sc.nextInt();//小伙伴的个数   //接下来就应该把接受到的信息,放到集合里  TreeMap<Integer,Integer> map1 = new TreeMap<>(); //因为不会输出相同的,所以不用判断  for(int i = 0;i < n;i++){ //直接对应键的最大值  int Di = sc.nextInt(); int Pi = sc.nextInt(); if(map1.containsKey(Di)){ if(Pi > map1.get(Di)){
                map1.put(Di,Pi);
            }
        } else{
            map1.put(Di,Pi);
        }
    }
    TreeMap<Integer,Integer> map2 = new TreeMap<>(); //只能得到key最小的key-value  Map.Entry<Integer,Integer> firstEntry = map1.firstEntry(); //并把它放到map2,map2里面存的最佳的工作能力,(1,1000)和(10,100),那么map2里面会存(1,1000),因为一个工作,可以很多个人做  map2.put(firstEntry.getKey(),firstEntry.getValue()); for( Map.Entry<Integer,Integer> f : map1.entrySet()){ //System.out.println(f.getKey()+"---"+f.getValue());  if(f.getValue() > firstEntry.getValue()){
            map2.put(f.getKey(),f.getValue());
            firstEntry = f;
        }
    } for(int i = 0; i< m;i++){ int friend = sc.nextInt(); //返回小于等于给定的key的key-value  //此时的map2里面已经是唯一的,一个键一个最大值  Map.Entry<Integer,Integer> floorEntry = map2.floorEntry(friend); if(floorEntry != null){
            System.out.println(floorEntry.getValue());
        }else{
            System.out.println(0);
        }
    }
}
发表于 2019-07-24 14:24:55 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner cin = new Scanner( System.in );
            //用TreeMap按能力值自动排号序   
        TreeMap<Integer,Integer> map = new TreeMap<>(  );
        while(cin.hasNext())
        {
            map.clear();
            int n = cin.nextInt();
            int m = cin.nextInt();
            for(int i=0;i<n;i++)
            {
                int d = cin.nextInt();
                int p = cin.nextInt();
                map.put( d,p );
            }
                 //定义一个最小值
            int Max = 0x80000000;
                 //遍历
            Iterator it = map.keySet().iterator();
            while (it.hasNext()) {
               Integer key = (Integer) it.next();
               Integer value = map.get(key);
                       //如果大于最小值,就存下来
               if(value>=Max) Max = value;
                       //如果小于 直接替换即可
               else map.put(key,Max );
            }
        for(int i=0;i<m;i++)
            {
                int a = cin.nextInt();
                        //找到小于或等于key(a)的最大键  如果不存在就赋值为null
                Map.Entry<Integer, Integer> result = map.floorEntry(a);
                if(result==null) System.out.println(0);
                else System.out.println( result.getValue() );
            }
        }
    }
}


发表于 2019-07-09 14:28:06 回复(4)


import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
// int N=3;
// int M=3;
Scanner sc=new Scanner(System.in);
int N=sc.nextInt();
int M=sc.nextInt();
int[][] nArray=new int[N][2];

for(int i=0;i<nArray.length;i++)
{
for(int j=0;j<nArray[i].length;j++)
{
nArray[i][j]=sc.nextInt();
}

}
int[] mArray=new int[M];
for(int i=0;i<mArray.length;i++)
{
mArray[i]=sc.nextInt();
}

HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();

for(int i=0;i<nArray.length;i++)
{
// for(int j=0;j<nArray[i].length;j++)
// {
map.put(nArray[i][1], nArray[i][0]);
// }
}

for(int j=0;j<mArray.length;j++)
{
int maxNum=0;
int temp=0;
for(Map.Entry<Integer, Integer> tempMap: map.entrySet())
{
if(tempMap.getValue()<=mArray[j])
{
temp=tempMap.getKey();
if(maxNum<temp)
{
maxNum=temp;
}
}
}
System.out.print(maxNum+" ");
}
}
}

编辑于 2019-07-06 08:23:06 回复(2)

Java

大思路:定义一个Job类,再定义一个比较器,先按难度从低到高排列,难度相同的,由报酬从高到底排列。然后排序输入的job数组,难度不同的,去掉报酬低难度高的元素;难度相同的,去掉报酬低的工作,把这些元素都加到TreeMap里面。最后再用小伙伴数组每次查TreeMap的floorKey,如果为null,则不能找到工作,返回0;如果不为null,获取key对应的value就是最高报酬。

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeMap;

public class Main {

    //Job类
    static class Job {
        int hard;
        int money;

        public Job(int hard, int money) {
            this.hard = hard;
            this.money = money;
        }
    }

    //Job比较器,先按难度从低到高排列,难度相同的,由报酬从高到底排列
    public static class JobComparator implements Comparator<Job> {
        public int compare(Job job1, Job job2) {
            return (job1.hard != job2.hard) ? (job1.hard - job2.hard) : (job2.money - job1.money);
        }
    }

    public static void process(Job[] job, int[] friends) {
        if (job.length < 1 || friends.length < 1) {
            return;
        }
        //排序job数组,难度不同的,去掉报酬低难度高的元素;难度相同的,去掉报酬低的工作,把这些元素都加到TreeMap里面
        Arrays.sort(job, new JobComparator());

        TreeMap<Integer, Integer> map = new TreeMap<>();
        map.put(job[0].hard, job[0].money);
        Job pre = job[0];
        for (int i = 1; i < job.length; ++i) {
            if (job[i].hard != pre.hard && job[i].money > pre.money) {
                pre = job[i];
                map.put(job[i].hard, job[i].money);
            }
        }

        // 小伙伴数组每次查TreeMap的floorKey,如果为null,则不能找到工作,返回0;如果不为null,获取key对应的value就是最高报酬
        for (int i = 0; i < friends.length; ++i) {
            if (map.floorKey(friends[i]) == null) {
                System.out.println(0 + " ");
            } else {
                System.out.println(map.get(map.floorKey(friends[i])) + " ");
            }
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int m = sc.nextInt();

        Job[] jobs = new Job[n];
        for (int i = 0; i < n; ++i) {
            int hard = sc.nextInt();
            int money = sc.nextInt();
            jobs[i] = new Job(hard, money);
        }

        int[] friends = new int[m];
        for (int i = 0; i < m; ++i) {
            friends[i] = sc.nextInt();
        }
        //调用主方法
        process(jobs, friends);
    }
}
发表于 2019-06-29 20:33:02 回复(0)
程序通过率只有40%,我注释了大概的思路,求大神们帮忙看看!
public class Main {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        Map<Integer,Integer> map = new HashMap<Integer, Integer>();        int n = Integer.parseInt(scanner.next());        int m = Integer.parseInt(scanner.next());        if (m == 0||n == 0){            System.out.println(0);            return;        }        int[] job = new int[2*n];        int[] power = new int[m];        int i;        for (i = 0;i<2*n;i++)            job[i] = Integer.parseInt(scanner.next());        for (i = 0;i<2*n;i+=2) //此处,因为题中说保证薪资不会出现相同的情况,所以我把薪资作为hashmap的键,对应的值为相应工作需要的能力            map.put(job[i+1],job[i]);        int j;        for ( j = 0;j<m;j++)            power[j] = Integer.parseInt(scanner.next());        j = 0;        Set<Integer> set = map.keySet();//因为hashmap的键是薪资,所以获取hashmap的键的set集合        Object[] salary = set.toArray();//set集合转数组,用数组工具类排序,即把薪资排序        Arrays.sort(salary);        while(j<power.length){            Integer max = null;            for (i = salary.length-1;i>=0;i--){                if (map.get(salary[i])<=power[j]){ //薪资数组已经由小到大排好序,先求最大薪资对应的工作难度并比较,当遇到第一个小与等于当前人的能力值的,退出循环并输出                    max = (Integer) salary[i];                    break;                }            }            System.out.println(max);            j++;        }     } }

编辑于 2018-05-03 19:44:03 回复(0)
//思路是对的,简单粗暴,超时了。gg
importjava.util.Scanner;
publicclassMain{
    publicstaticvoidmain(String[] args){
        Scanner sc=newScanner(System.in);
        intjob=sc.nextInt();
        intfri=sc.nextInt();
        int[] jobD=newint[job];
        int[] jobS=newint[job];
        int[] friD=newint[fri];
//        int[] friMS=new int[fri];
 
        for(inti=0;i<job;i++){
            jobD[i]=sc.nextInt();
            jobS[i]=sc.nextInt();
        }
        for(inti=0;i<fri;i++){
            friD[i]=sc.nextInt();
        }
        for(inti=0;i<fri;i++){
            inttmp=0;
//            int tmpC=0;
            for(intj=0;j<job;j++){
                if(friD[i]>=jobD[j]){
                    if(tmp<jobS[j]){
                        tmp=jobS[j];
//                        tmpC=j;
                    }
                }
            }
//            friMS[i]=jobS[tmpC];
            System.out.println(tmp);
        }
//        for(int i=0;i<fri;i++){
//            System.out.println(friMS[i]);
//        }
    }
}

发表于 2018-04-09 22:16:18 回复(0)