孙悟空现在正在天宫偷吃蟠桃,时间有限,王母娘娘一会儿就会回来,孙悟空要在王母娘娘回来之前尽可能多偷吃一点蟠桃。
你的任务是帮助孙悟空决定怎么吃蟠桃才能尽可能多吃。输出孙悟空最多可以吃掉的蟠桃数量。
特别说明:本题中不能直接使用排序库函数,如您使用了排序库函数,即便运行通过也会被判为0分。
孙悟空现在正在天宫偷吃蟠桃,时间有限,王母娘娘一会儿就会回来,孙悟空要在王母娘娘回来之前尽可能多偷吃一点蟠桃。
你的任务是帮助孙悟空决定怎么吃蟠桃才能尽可能多吃。输出孙悟空最多可以吃掉的蟠桃数量。
特别说明:本题中不能直接使用排序库函数,如您使用了排序库函数,即便运行通过也会被判为0分。
第一行两个正整数N和P,N表示蟠桃的数量,P是王母娘娘还有多长时间后会回来。
接下来一行N个整数表示每个蟠桃吃掉所需的时间。
注意,掐着王母娘娘的回来的点吃完是很危险的,所以必须在王母娘娘回来前吃完,不能是回来时刚好吃完。
输出孙悟空最多能吃掉的蟠桃的数量。
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
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)
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; } }
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++]; } } }
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)这题真的简单,直接快排就行了
#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; }