4.1美团笔试,大佬指点一下,真的很郁闷
不知道哪里错了,错了也不知道该怎么调,没啥进步,大佬可以指点一下吗?
感激不尽
第一题
45%
输入n个数和m次操作
把+改成别的符号
class Solution { public double getRes(int[] a,long[] an, int index,String tmp) { int len=an.length; double sum=0; sum=an[len-1]-an[index+1]+an[index-1]; if(tmp.equals("+")){ sum=sum+a[index]+a[index+1]; }else if(tmp.equals("-")){ sum=sum+a[index]-a[index+1]; }else if(tmp.equals("*")){ sum=sum+a[index]*a[index+1]; }else if(tmp.equals("/")){ sum=sum+(double)a[index]/a[index+1]; } return sum; } } public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); int n, m; n=cin.nextInt(); int[] a=new int[n+1]; long[] an=new long[n+1]; long sum=0; for(int i=1;i<=n;i++){ a[i]=cin.nextInt(); sum+=a[i]; an[i]=sum; } m=cin.nextInt(); int index; String tmp; for(int j=0;j<m;j++){ index=cin.nextInt(); tmp=cin.next(); Solution solution = new Solution(); System.out.printf("%.1f",solution.getRes(a,an,index,tmp)); } } }
第二题
100%
排序然后减一下
第三题
18%
收藏夹,0是改,1是查
就模拟了一下啊,维护了一个前缀和
class Solution { public long select(long[] an, int x,int y) { return an[y]-an[x-1]; } public void update(long[] a,long[] an,int x,int y){ a[x]=y; for(int i=x;i<an.length;i++){ an[i]+=y; } } } public class Test02 { public static void main(String args[]) { Scanner cin = new Scanner(System.in); int n,m; n=cin.nextInt(); m=cin.nextInt(); long[] p=new long[m+1]; int[] x=new int[m+1]; int[] y=new int[m+1]; long[] a=new long[n+1]; long[] an=new long[n+1]; for(int i=1;i<=m;i++){ p[i]=cin.nextInt(); } for(int i=1;i<=m;i++){ x[i]=cin.nextInt(); } for(int i=1;i<=m;i++){ y[i]=cin.nextInt(); } //p表示操作 //x表示第一个操作数,y第二个 //a原数组,an前缀和 Solution solution = new Solution(); for(int i=1;i<=m;i++){ if(p[i]==0){ solution.update(a,an,x[i],y[i]); }else { System.out.println(solution.select(an,x[i],y[i])); } } } }
第四题
18%
魔法水,指定倒满某个杯子
dp
public class Test02 { public static void main(String args[]) { Scanner cin = new Scanner(System.in); int n; n=cin.nextInt(); long[] a=new long[n+1]; int[] z=new int[n+1]; int[] z0=new int[n+1]; long[] asum=new long[n+1]; for(int i=1;i<=n;i++){ a[i]=cin.nextInt(); } for(int i=1;i<=n;i++){ a[i]=a[i]-cin.nextInt(); } for(int i=1;i<=n;i++){ z[i]=cin.nextInt(); } //a每个杯子还差多少可以倒满 //z每个杯子1ml需要的魔法值 //asum倒满这个杯子需要的最小魔法值 //z0 是通过哪个魔法值倒满的 z0[1]=z[1]; asum[1]=z0[1]*a[1]; //dp枚举的过程 for(int i=2;i<=n;i++){ long sum1=asum[i-1]+z0[i-1]*a[i]; long sum2=z[i]*a[i]; if(sum1<sum2){ asum[i]=sum1; z0[i]=z0[i-1]; }else{ asum[i]=sum2; z0[i]=z[i]; } } //输出 int m=cin.nextInt(); int[] q=new int[m+1]; for(int i=1;i<=m;i++){ q[i]=cin.nextInt(); } for(int i=1;i<=m;i++){ System.out.println(asum[q[i]]); } } }#美团4.1笔试##美团##笔试#