国内A厂825校招笔试,求大神指点

1. 计算字典序介于给定的两个字符串之间的字符串的个数。
花了15分钟。一开始想暴力,看了数据规模觉得不行。
public class Main {

    public static long helper(String a, String b) {
      if (a.compareTo(b) >= 0)
          return 0;
      int n = a.length();
      long res = 0;
      long base = 1;
      for (int i = n-1; i >= 0; i--) {
          int num1 = a.charAt(i) - 'a';
          int num2 = b.charAt(i) - 'a';
          res += (num2 - num1) * base;
          base *= 26;
      }
      return res - 1;
    }

    public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      int T = sc.nextInt();
      for (int t = 0; t < T; t++) {
          int n = sc.nextInt();
          String a = sc.next();
          String b = sc.next();
          System.out.println(helper(a, b));
      }
    }
}

2. 有T个案例。每个案例有一个n代表怪兽数量,m代表宝剑耐久度。有n行,每一行是怪兽的hp和杀死后获得的奖励。耐久度高于hp可以杀怪兽。奖励是可以不使用耐久度就可以杀死a个怪兽。对于每一个案例输出最多杀几个,花费的最少的耐久度。
一开始以为必须按顺序杀,浪费不少时间。后来觉得是要排序,贪心算法。反正最后还是没做出来,通过5%,叹气。请大家帮我看看问题。我现在还没想明白我错哪了。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    static long monsters = 0;
    static long loss = 0;
    public static void helper(ArrayList<Entry> entries, long m, int n) {
        int arm = 0;
        
        while (entries.size() > 0) {
            boolean found = false;
            for (int i = 0; i < entries.size(); i++) {
                Entry e = entries.get(i);
                if (arm == 0 && e.hp > m)
                    continue;
                //if (arm == 0 && m <= 0) break;
                found = true;
                if (arm > 0)
                    arm--;
                else {
                    m -= e.hp;
                    loss += e.hp;
                }
                arm += e.arm;
                monsters++;
                entries.remove(i);
                break;
            }
            if (!found) 
                return;
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int t = 0; t < T; t++) {
            int n = sc.nextInt();
            long m = sc.nextLong();
            ArrayList<Entry> entries = new ArrayList();
            for (int i = 0; i < n; i++) {
                long hp = sc.nextLong();
                long arm = sc.nextLong();
                Entry e = new Entry(hp, arm);
                entries.add(e);
            }
            Collections.sort(entries);
            helper(entries, m, n);
            System.out.println(monsters + " " + loss);
            monsters = 0;
            loss = 0;
        }
    }
}

class Entry implements Comparable<Entry> {
    long hp;
    long arm;
    
    public Entry(long h, long a) {
        hp = h;
        arm = a;
    } 

        public int compareTo(Entry e2) {
        if (arm != e2.arm)
            return Long.compare(e2.arm, arm);
        return Long.compare(hp, e2.hp);
    } 
}










#笔试题目#
全部评论

相关推荐

点赞 评论 收藏
分享
球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务