Codeforces Educational.Round.28
Posted 薛定谔的Submit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Educational.Round.28相关的知识,希望对你有一定的参考价值。
A - Chores
题目大意:
有一个人有n份工作要完成,每份工作耗时不同,他有k次机会,能让一份工作只需要x个时间单位就能完成。求其最短工作时长。
输入一行三个整数:n,k,x(1 <= k <= n <= 100,1 <= x <= 99)。
输入一行n 个整数:代表每份工作的耗时,此行所有整数均 ∈ [2,100]。
样例输入:4 2 2 5 2 1
3 6 7 10 100 100 100 100 100
样例输出:13 302
解题思路:
单纯的sort一下即可,从后往前遍历,如果当前数字大于x,那么使用一次机会,机会没有了就用本来的速度。
A C 代码:
1 import java.util.*; 2 3 public class Main{ 4 public static void main(String[] args){ 5 Scanner sc = new Scanner(System.in); 6 while(sc.hasNext()){ 7 int a = sc.nextInt(); 8 int b = sc.nextInt(); 9 int c = sc.nextInt(); 10 int m[] = new int[a]; 11 for(int i = 0;i < a;i ++){ 12 m[i] = sc.nextInt(); 13 } 14 Arrays.sort(m); 15 int ans = 0; 16 for(int i = a - 1;i >= 0;i --){ 17 if(b != 0 && c < m[i]){ 18 ans = ans + c; 19 b --; 20 } 21 else{ 22 ans = ans + m[i]; 23 } 24 } 25 System.out.println(ans); 26 } 27 } 28 }
B - Balanced Substring
题目大意:
首先题目给你一个平衡串的定义,该串中0和1的数目相等即为平衡串。
要求在给定一个只含有‘0’和‘1’的字符串中,
求解其最大平衡子串的长度(没有则输出0)。
输入一行一个整数:n,代表接下来字符串的长度(1 <= n <= 1e6)。
输入一行一个字符串:s,代表该字符串。
样例输入:8 3
11010111 111
样例输出:4 0
解题思路:
声明 sum = 0 代表当前遇到的 0 1 的情况。
遇0 sum -- ,遇1 sum ++ 。
用一个长度为 n 的一维数组summ[]储存当前的sum。
summ[]中,如果出现两个数字相等,那么就出现了平衡子串。
该平衡子串的长度即为两个数字在summ[]里的下标。
用mark[2 * n + 1][2]数组记录第一次出现某一个数字的下标和最后一次出现这个数字的下标。
因为假设n == 5,那么所得的sum的可能 ∈[-5,5],共11单位的区间(即2 * 5 + 1)。
最后遍历mark[][],找到最大的差就是最长平衡子串。
该程序在测试时,无法判断如果sum == 0时的子串,比如 0110,101010,10001110等等。
所以在遍历summ[]中,储存当sum == 0时的最后下标位置。
在遍历mark[][]之后,继续进行一次比较,求出最大值即可。
A C 代码:
1 import java.util.*; 2 3 public class Main{ 4 public static void main(String[] args){ 5 Scanner sc = new Scanner(System.in); 6 while(sc.hasNext()){ 7 int n = sc.nextInt(); 8 int mark[][] = new int[2 * n + 1][2]; 9 for(int i = 0;i < 2 * n + 1;i ++){ 10 mark[i][0] = -1; 11 mark[i][1] = -1; 12 } 13 String enter = sc.nextLine(); 14 String _in = sc.nextLine(); 15 char in[] = _in.toCharArray(); 16 int sum = 0; 17 int summ[] = new int[n]; 18 int _max = 0; 19 for(int i = 0;i < n;i ++){ 20 if(in[i] == ‘0‘){ 21 sum --; 22 summ[i] = n + sum; 23 } 24 else{ 25 sum ++; 26 summ[i] = n + sum; 27 } 28 if(summ[i] == n){_max = i + 1;} 29 } 30 for(int i = 0;i < n;i ++){ 31 if(mark[summ[i]][0] == -1){mark[summ[i]][0] = i;} 32 mark[summ[i]][1] = i; 33 } 34 //for(int i = 0;i < 2 * n + 1;i ++){System.out.println(mark[i][0] + " " + mark[i][1]);} 35 //for(int i = 0;i < n;i ++){System.out.println(summ[i]);} 36 int maxx = -1; 37 for(int i = 0;i < 2 * n + 1;i ++){ 38 if(mark[i][1] - mark[i][0] > maxx){maxx = mark[i][1] - mark[i][0];} 39 } 40 if(_max > maxx){maxx = _max;} 41 System.out.println(maxx); 42 } 43 } 44 }
以上是关于Codeforces Educational.Round.28的主要内容,如果未能解决你的问题,请参考以下文章
codeforces Codeforces 650A Watchmen