题目描述:
公司最新研发了一种产品,共产生了n件。有m个客户想购买此产品,第i个客户出价Vi元。为确保公平,公司决定要以一个固定的价格出售产品。每一个出价不低于要价的客户将会以公司决定的价格购买一件产品,余下的将会被拒绝购买。请你找出能够让公司利润最大化的售价。如果有多种定价方案可以最大化总收入,输出最小定价。
输入:
输入第一行两个整数n(1<=n<=1000),m(1<=n<=1000),分别表示产品数和客户数。
第二行m个整数Vi(1<=Vi<=1000000),分别表示第i个客户出价。
输出:
输出代表能够让公司利润最大化的最小售价。
样例输入:
5 4
2 8 10 7
样例输出:
7
C语言:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp(const void *a, const void *b)
{
return *(int *)a-*(int *)b; //升序
}
int min(int a, int b)
{
if(a > b)
return b;
else return a;
}
int main(){
int a[1000];
int n, m, a0, ans=0;
scanf("%d%d", &n, &m);
for(int i=0; i<m; i++)
scanf("%d", &a[i]);
qsort(a,m,sizeof(a[0]),cmp);//调用qsort排序
for(int i=0;i<m;i++)//输出排序后的数组
printf("%d\t",a[i]);
for(int i=0; i<m; i++){
if (ans < a[i]*min(n,m-i))
{
ans=a[i]*min(n,m-i);
a0 = a[i];
}
}
printf("\n%d",a0);
return 0;
}
Java:
import java.util.Arrays;
import java.util.Scanner;
public class jing {
public static void main(String[] args) {
int ans=0;
int a=0;
Scanner scanner = new Scanner(System.in);
int n=scanner.nextInt();
int m=scanner.nextInt();
int[] list=new int[m];
for(int i=0;i<m;i++){
list[i]=scanner.nextInt();
}
Arrays.sort(list);
for(int i=0;i<m;i++){
if (ans<list[i]*Math.min(n, m-i)){
ans=list[i]*Math.min(n, m-i);
a=list[i];
}
}
System.out.println(a);
}
}