拼多多拼越计划笔试
多多吃饭:
公司提供午餐N套,晚餐M套,
要求最多一顿午餐和最多一顿晚餐(可以一顿都不吃)的美味值相加必须大于等于目标美味值T,求最少摄入热量。
输入:N,M,目标美味值T;
每套午餐的美味值和热量值;
每套晚餐的美味值和热量值。
输出:最少的摄入热量,无法满足。
多组示例:
输入:
5 1 9
9 1
4 9
3 1
2 3
6 5
9 8
输出:
4
输入:
1 1 0
3 1
2 1
输出:
0
输入:
2 1 4
3 1
2 1
1 2
输出:
-1
备注:
0<=T<=200000
1<=N,M,xi,yi<=100000
【我的代码】考完才写出来线性时间复杂度的,不知道对不对。示例都过了。
import java.util.Scanner;
public class 拼多多_3_2 {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
int N=sc.nextInt();
int M=sc.nextInt();
int T=sc.nextInt();
int an[][]=new int[N+1][2];
int minN[]=new int[100001];//下标i代表午餐美味值,[i]代表达到该美味值最少午餐热量
int visited[]=new int[100001];//标记有没有遍历过
int maxMei=Integer.MIN_VALUE;
int maxMeiMinRe=Integer.MAX_VALUE;
int am[][]=new int[M+1][2];
an[0][0]=0;
an[0][1]=0;
am[0][0]=0;
am[0][1]=0;
for(int i=1;i<=N;i++) {
an[i][0]=sc.nextInt();
an[i][1]=sc.nextInt();
}
for(int i=1;i<=M;i++) {
am[i][0]=sc.nextInt();
am[i][1]=sc.nextInt();
}
for(int i=1;i<=N;i++) {
if(an[i][1]>=maxMei) {
maxMei=an[i][1];
if(maxMeiMinRe>an[i][0]) {
maxMeiMinRe=an[i][0];
}
}
if(an[i][0]<minN[an[i][1]] || visited[an[i][1]]==0) {
minN[an[i][1]]=an[i][0];
}
visited[an[i][1]]=1;
}
for(int i=maxMei-1;i>0;i--) {
if(minN[i]>minN[i+1] || visited[i]==0) {
minN[i]=minN[i+1];
}
visited[i]=1;
}
if(T==0) {
System.out.println(0);
}else {
int minRe=Integer.MAX_VALUE;
for(int i=0;i<=M;i++) {
if(am[i][1]>=T) {
minRe=Math.min(minRe, am[i][0]);
}else if(am[i][1]+maxMei>=T) {
minRe=Math.min(minRe, am[i][0]+minN[T-am[i][1]]);
}
}
if(minRe!=Integer.MAX_VALUE) {
System.out.println(minRe);
}else {
System.out.println(-1);
}
}
}
}