首页 > 试题广场 >

孙悟空吃蟠桃

[编程题]孙悟空吃蟠桃
  • 热度指数:708 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

孙悟空现在正在天宫偷吃蟠桃,时间有限,王母娘娘一会儿就会回来,孙悟空要在王母娘娘回来之前尽可能多偷吃一点蟠桃。

你的任务是帮助孙悟空决定怎么吃蟠桃才能尽可能多吃。输出孙悟空最多可以吃掉的蟠桃数量。

特别说明:本题中不能直接使用排序库函数,如您使用了排序库函数,即便运行通过也会被判为0分。


输入描述:

第一行两个正整数N和P,N表示蟠桃的数量,P是王母娘娘还有多长时间后会回来。

接下来一行N个整数表示每个蟠桃吃掉所需的时间。

注意,掐着王母娘娘的回来的点吃完是很危险的,所以必须在王母娘娘回来前吃完,不能是回来时刚好吃完。



输出描述:

输出孙悟空最多能吃掉的蟠桃的数量。

示例1

输入

8 30
13 4 25 19 17 23 29 8

输出

3

备注:

对于40%的数据有,1<= N <= 100, 1<= P <= 10000,每个蟠桃需要吃的时间1<=t<=100

对于100%的数据有,1<= N <= 1e5,1 <= P <= 1e12,每个蟠桃需要吃的时间1<=t<=1e7

贪心思想:优先吃耗时少的蟠桃。对N个蟠桃的耗时进行排序(写个快排就行),然后模拟吃桃过程,没时间了或者没桃了就退出循环。
def quick_sort(alist, first, last):
    if first >= last:
        return
    mid_value = alist[first]
    low = first
    high = last
    while low < high:
        while low < high and alist[high] >= mid_value:
            high -= 1
        alist[low] = alist[high]
        while low < high and alist[low] < mid_value:
            low += 1
        alist[high] = alist[low]
    alist[low] = mid_value
    # 对low左边的列表执行快速排序
    quick_sort(alist, first, low - 1)
    # 对low右边的列表执行快速排序
    quick_sort(alist, low + 1, last)

if __name__ == "__main__":
    n, p = map(int, input().strip().split())
    # 将耗时少的蟠桃排在前面
    time_consume = list(map(int, input().strip().split()))
    quick_sort(time_consume, 0, n - 1)
    # 模拟吃桃过程
    count = 0
    for i in range(n):
        if n > 0 and p >= time_consume[i]:
            p -= time_consume[i]
            n -= 1
            count += 1
        else:
            # 没时间或者没桃了
            break
    print(count)
编辑于 2021-03-08 16:35:22 回复(0)
放一个java的,用的快排
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        long[] int1 = Arrays.stream(br.readLine().split(" ")).mapToLong(Long::parseLong).toArray();
        long n = int1[0];
        long p = int1[1];

        long[] int2 = Arrays.stream(br.readLine().split(" ")).mapToLong(Long::parseLong).toArray();

        quickSort(int2, 0, (int) (n - 1));
//        Arrays.sort(int2);
        long res = 0;
        for (long i = 0; i < n; i++) {
            if (p > int2[(int) i]) {
                p -= int2[(int) i];
                res++;
            } else {
                break;
            }
        }
        System.out.println(res);
    }

    public static void quickSort(long[] arr, int leftPos, int rightPos) {
        if (rightPos < leftPos) {
        } else {
            //将数列最左边第一个数字作为基准数
            int initLeftPos = leftPos;
            int initRightPos = rightPos;
            long baseNum = arr[leftPos];

            while (rightPos > leftPos) {
                //第二步:右边指针找到小于基准数的就停下
                while (rightPos > leftPos && arr[rightPos] >= baseNum) {
                    rightPos--;
                }

                //第三步:左边指针找到大于基准数的就停下
                while (rightPos > leftPos && arr[leftPos] <= baseNum) {
                    leftPos++;
                }

                //交换两个指针最终标记的数字
                if (rightPos > leftPos) swap(arr, leftPos, rightPos);
            }
            //当左右两边指针重合时,将基准数与指针指向数字交换
            swap(arr, leftPos, initLeftPos);
            //指针左半边递归,以进来的数组的左边为界,右边是左右指针相同时的左边一个
            quickSort(arr, initLeftPos, leftPos - 1);
            //右边同理
            quickSort(arr, rightPos + 1, initRightPos);
        }
    }

    //swap方法:将数组中leftPos和rightPos上的两个数值进行交换
    public static void swap(long[] arr, int leftPos, int rightPos) {
        long temp = arr[leftPos];
        arr[leftPos] = arr[rightPos];
        arr[rightPos] = temp;
    }
}

发表于 2022-09-09 14:35:51 回复(0)
算法就是贪心排序加上从小累减q,略。
在第四卡了很久,检查算法没问题,检查数据发现,这题并没有给定数据限制,将int改为long long后,可运行。
发表于 2021-09-14 18:02:33 回复(0)
这道题有没有用java写的呢?为什么我快排或者归并排序之后得到的结果只能通过8个呢?我确定我的快排和归并排序没问题
import java.util.Scanner; public class 孙悟空吃蟠桃 {  static Long [] nums; public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Long n = scanner.nextLong();
        Long p = scanner.nextLong();
        Long [] ints = new Long[Math.toIntExact(n)];  for(int i=0;i<n;i++){
            ints[i] = scanner.nextLong();
        }  nums= ints; quickSort(0,nums.length);
            System.out.println(solve(nums,p));
    }  private static void quickSort(int begin, int end) { if(end-begin<2)return; int mid=pivox(begin,end); quickSort(begin,mid); quickSort(mid+1,end);
    } /**  * nums[begin,end)范围内的数据进行轴点元素化  * @param begin  * @param end  * @return  */  private static int pivox(int begin, int end) {
        end--;
        Long tmp=nums[begin]; while(begin<end){ while(begin<end){ //先从右到左  if(nums[end]>tmp){
                    end--;
                }else{ nums[begin++]=nums[end]; break;
                }
            } while(begin<end){ if(nums[begin]<=tmp){
                    begin++;
                }else{ nums[end--]=nums[begin]; break;
                }
            }
        } nums[begin]=tmp; return begin;
    } private static long solve(Long[] ints, long p) { long max=0; int total=0; for(int i=0;i<ints.length;i++){
            total+=ints[i]; if(total<p){
                max++;
            }else{ break;
            }
        } return max;
    } /**  * 使用归并排序对数组进行排序  * @param ints  */  private static void mergerSort(int[] ints) { mergerSort(ints,0,ints.length);
    } /**  * ints[begin,end)范围内的数据进行归并排序  * @param ints  * @param begin  * @param end  */  private static void mergerSort(int[] ints, int begin, int end) { if(end-begin<2)return; int mid =(begin+end)/2; mergerSort(ints, begin, mid); mergerSort(ints,mid,end); merger(ints,begin,mid,end);
    } /**  * 合并两个[begin,mid)[mid,end)这两个有序数组  * @param ints  * @param begin  * @param mid  * @param end  */  private static void merger(int[] ints, int begin, int mid, int end) { int[] tmp = new int[end - begin]; for(int i=0,index1=begin,index2=mid;i<tmp.length;i++){ if(index1==mid){
                tmp[i]=ints[index2++];
            }else if(index2==end){
                tmp[i]=ints[index1++];
            }else if(ints[index1]>ints[index2]){
                tmp[i]=ints[index2++];
            }else{
                tmp[i]=ints[index1++];
            }
        } for(int i=begin,j=0;i<end;i++){
            ints[i]=tmp[j++];
        }
    }
}

编辑于 2022-08-15 11:41:46 回复(0)
l1=list(map(int,input().strip().split()))
l2=list(map(int,input().strip().split()))
def partition(arr,low,high):
    i=low-1
    pivot=arr[high]
    for j in range(low,high):
        if arr[j]<=pivot:
            i=i+1
            arr[i],arr[j]=arr[j],arr[i]
    arr[i+1],arr[high]=arr[high],arr[i+1]
    return i+1
def quickSort(arr,low,high):
    if low<high:
        pi=partition(arr,low,high)
        quickSort(arr,low,pi-1)
        quickSort(arr,pi+1,high)
quickSort(l2,0,l1[0]-1)
 
res=0
res1=0
for i in range(l1[0]):
    if res<l1[1]:
        res+=l2[i]
        res1=i+1
    else:
        res-=l2[i-1]
        res1=i-1
        break
 
print(res1)
这题真的简单,直接快排就行了
发表于 2021-04-22 20:01:47 回复(0)
#include <bits/stdc++.h>
  
using namespace std;
  
int main() {
    using ll = long long;
    ll n, maxTime;
    cin >> n >> maxTime;
    priority_queue<ll, vector<ll>, greater<ll>> q;
    for (int i = 0; i < n; ++i) {
        ll num;
        cin >> num;
        q.push(num);
    }
    int cnt = 0;
    while(!q.empty() && maxTime > 0) {
        ++cnt;
        maxTime -= q.top();
        q.pop();
    }
    if (maxTime <= 0) {
        cnt--;
    }
    cout << cnt;
     
    return 0;
}

发表于 2021-03-03 14:52:24 回复(0)