import java.util.Scanner; /** *C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式? */ public class Main { // 在n个中选择c个的问题,组合问题,递归,找出所有的组合,符合条件的count++ public int transport(int n, int t, int c, int[] a) { int count = 0; int sum = 0; if (a == null || n <= 0 || t < 0 || c <= 0) { return 0; } // 建立起始滑动窗口 for (int i = 0; i < c; i++) { sum += a[i]; } if (sum <= t) count++; for (int i = c; i < n; i++) { // 滑动:往后加一个往前减一个 sum = sum + a[i] - a[i - c]; if (sum <= t) count++; } return count; } public static void main(String[] args) { // 第一行数据三个整数:n,t,c(1≤n≤2e5,0≤t≤1e9,1≤c≤n), Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int n = sc.nextInt();// 共n名罪犯 int t = sc.nextInt();// 最大罪行值之和 int c = sc.nextInt();// 转移c名犯人 // 第二行按入狱时间给出每个犯人的罪行值ai(0≤ai≤1e9) int[] a = new int[n]; for (int i = 0; i < n; i++) a[i] = sc.nextInt(); Main convict = new Main(); System.out.println(convict.transport(n, t, c, a)); } } }
java实现百度之C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行
最新推荐文章于 2022-11-05 14:46:52 发布