360笔试24下午,回文数和一个类似背包的问题
第一题要求写在纸上的大写字母字符串,把纸翻过来一样,也就是回文数,然后+判断字母是否对称
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(true){ String str=sc.next(); char a[]=str.toCharArray(); int l=0; int r=a.length-1; int k=0; while(l<=r){ if(a[l]==a[r]){ if(a[l]=='A'||a[l]=='H'||a[l]=='X'||a[l]=='V'||a[l]=='M'||a[l]=='W'||a[l]=='T'||a[l]=='Y'||a[l]=='U'||a[l]=='I'||a[l]=='O'){ l++; r--; }else{ k=1; break; } }else{ k=1; break; } } if(k==1){ System.out.println("NO"); } else{ System.out.println("YES"); } } } }
第二题闯关游戏,输入一个数,表示有n组数据,每组数据第一个是该关卡有多少积分,第二个0 1表示是否有宝盒。宝盒打开就当前累计积分翻倍,不打开就累加当前关卡的积分。求积分最大
思路:先闯所有没宝盒的,再去闯有宝盒的
在判断要不要打开宝盒
唯一注意累计积分可能会溢出,应使用long
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m=sc.nextInt(); long count=0; int k=0; int a[]=new int[m]; for(int i=0;i<m;i++){ int x=sc.nextInt(); int y=sc.nextInt(); if(y==0){ count+=x; }else{ a[k]=x; k++; } } int b[]= Arrays.copyOfRange(a,0,k); Arrays.sort(b); while(k>0){ k--; if(count*2>b[k]+count){ count*=2; }else{ count+=b[k]; } } System.out.println(count); } }