「土」巨石滚滚 题解

「土」巨石滚滚

http://www.nowcoder.com/questionTerminal/76ad46407cae4ab5b1a8bf9281b0f4a7

wa了几次才ac掉这道题,每次都是出现很多小小的问题,所以想把这道题详细的写一下。
首先这道题的思路是贪心+快排
我们读完题之后,一般都会想到贪心,不过我们要知道怎样贪,贪什么。
就像我们打怪一样,我们一定是去先打那个等级低,还给你加好多经验的小怪物,而不是一上来就去打BOSS然后***掉。
第一步就是去打那种回血的怪物,也就是说回馈的稳定性大于丧尸的稳定性的障碍物。
这里我们应该思考一下,打这些回血的怪物是否也要考虑优先性。
当然,我们要从小怪物打起,等我们攒够足够多的经验之后,才可以吃掉等级高的怪物呀。
所以我们要把这些回馈>丧失的障碍物给他做一个排序,丧失度低的障碍物排在前面我们先去冲撞。
接下来第二步就是要去打那些回馈<=丧失的障碍物了。这里我们需要思考一个问题,我们优先打哪些障碍物呢?
给大家举一个例子.
49 49
52 0
26 24
50 50
这是四组回馈<=丧失的障碍物,如果此时m=54,那应该输出Yes还是No呢。
假如我们先打丧失值最大的,那么我们选择52 0这一组,冲破之后我们的m只剩下2了,没法打其他障碍物了。
这里我们思考一下,我们是否应该先去冲破回复最多的,然后让我们尽可能的去冲破其他的障碍物,我们先选50 50,49 49,26 24,52 0,这样可以刚好完成任务。
如果这些障碍物丧失值足够大,我们怎样冲都不可能全部冲破,那就还不如优先去冲破回复最多的,让我们更有可能的去冲破下一个障碍物,最大可能性的完成任务。
代码有些繁琐,看看思路就好啦!!!

import java.math.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.*;
public class Main {
    public static void main(String args[])throws IOException
    {
        StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
        in.nextToken();
        int T = (int)in.nval;
        for(int t=0;t<T;t++)
        {
        in.nextToken();
        int n = (int)in.nval;
        in.nextToken();
        long m = (long)in.nval;
        int a[][] = new int[n][2];
        int b[][] = new int[n][2];
        int ap=0,bp=0;
        for(int i=0;i<n;i++)
        {
            in.nextToken();
            int x = (int)in.nval;
            in.nextToken();
            int y = (int)in.nval;
            if(y-x>0)
            {
                a[ap][0] = x;
                a[ap++][1] = y;
            }
            else{
                b[bp][0] = x;
                b[bp++][1] = y;
            }
        }
            boolean neng = true;
            if(ap>1)
                quickSort(0,ap-1,a);
            if(bp>1)
                quickSorts(0,bp-1,b);
            /*for(int i=0;i<ap;i++)
            {
               out.println(a[i][0]+" "+a[i][1]);
            }
            out.println();
            for(int i=0;i<bp;i++)
            {
               out.println(b[i][0]+" "+b[i][1]);
            }*/
            for(int i=0;i<ap;i++)
            {
                if(a[i][0]>m)
                {
                    neng = false;
                    break;
                }
                else{
                    m+=(a[i][1]-a[i][0]);
                }
            }
            if(neng ==false)
                out.println("No");
            else{
                for(int i=bp-1;i>=0;i--)
            {
                if(b[i][0]>m)
                {
                    neng = false;
                    break;
                }
                else{
                    m-=(b[i][0]-b[i][1]);
                }
            }
                if(neng==true)
                    out.println("Yes");
                else{
                    out.println("No");
                }

                }
        }
        out.flush();
    }
    public static void quickSort(int l,int r,int a[][])
    {
        int i=l,j=r,key=a[(l+r)/2][0],temp,temps;
        do{
            while(a[i][0]<key) i++;
            while(a[j][0]>key) j--;
            if(i<=j)
            {
                temp = a[i][0];
                a[i][0] = a[j][0];
                a[j][0] = temp;
                temps = a[i][1];
                a[i][1] = a[j][1];
                a[j][1] = temps;
                i++;
                j--;
            }
        }while(i<=j);
        if(i<r) quickSort(i,r,a);
        if(l<j) quickSort(l,j,a);
    }
     public static void quickSorts(int l,int r,int a[][])
    {
        int i=l,j=r,key=a[(l+r)/2][1],temp,temps;
        do{
            while(a[i][1]<key) i++;
            while(a[j][1]>key) j--;
            if(i<=j)
            {
                temp = a[i][1];
                a[i][1] = a[j][1];
                a[j][1] = temp;
                temps = a[i][0];
                a[i][0] = a[j][0];
                a[j][0] = temps;
                i++;
                j--;
            }
        }while(i<=j);
        if(i<r) quickSorts(i,r,a);
        if(l<j) quickSorts(l,j,a);
    }
                  }
全部评论
请问 在回馈<=丧失的情况下(即后一种情况),为什么不可以优先选丧失与回馈差值最小的呢,也就是净减少最小的呢?望大佬告知
点赞 回复 分享
发布于 2020-06-12 18:27

相关推荐

11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
10-30 23:23
已编辑
中山大学 Web前端
去B座二楼砸水泥地:这无论是个人素质还是专业素质都👇拉满了吧
点赞 评论 收藏
分享
评论
3
2
分享
牛客网
牛客企业服务