小易觉得高数课太无聊了,决定睡觉。不过他对课上的一些内容挺感兴趣,所以希望老师讲到有趣的地方的时候叫醒他一下。你知道了小易对一堂课每分钟知识点的感兴趣程度,并以分数量化,以及他在这堂课上每分钟是否会睡着,你可以叫醒他一次,这会使得他在接下来的k分钟内保持清醒。你需要选择一种方案最大化小易这堂课听到的知识点分值。
第一行n,k, (1 <= n, k <= 105),表示这堂课持续多少分钟,以及叫醒小易一次使他能够保持清醒的时间。
第二行 n个数,a1,a2,…,an(1<=ai<=104),表示小易对每分钟知识点的感兴趣评分。
第三行 n个数,t1,t2,…,tn,表示每分钟小易是否清醒,1表示清醒。
小易这堂课听到的知识点的最大兴趣值。
输入
6 3
1 3 5 2 5 4
1 1 0 1 0 0
输出
16
代码: AC 90%
import java.util.Scanner;
public class testkeshui {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt(); sc.nextLine();
int[][] map = new int[n][2];
String[] str1 = sc.nextLine().split(" ");
String[] str2 = sc.nextLine().split(" ");
for (int i=0;i0] = Integer.valueOf(str1[i]);
map[i][1] = Integer.valueOf(str2[i]);
}
int resultMax = 0;
int curMax = 0;
int wake = 0; //醒着的时间获得的兴趣值
for (int i=0;iif (map[i][1] == 1){
wake += map[i][0];
}
}
for (int i=0;iif (map[i][1] == 0){
if (map[i][1] == 0){
//从 i 开始,往后加上 k 个数
curMax = getSum(map,i,k);
curMax = curMax+wake;
}
resultMax = Math.max(resultMax,curMax);
}
}
resultMax = Math.max(resultMax,curMax);
System.out.println(resultMax);
}
private static int getSum(int[][] map, int i,int k){
int res = 0; //接下来的 k 包含当前吗?
for (int j=0;jif (i+jif (map[i+j][1] == 0)
res += map[i+j][0];
}
}
return res;
}
}
又到了丰收的季节,恰好小易去牛牛的果园里游玩。 牛牛常说他多整个果园的每个地方都了如指掌,小易不太相信,所以他想考考牛牛。 在果园里有N堆苹果,每堆苹果的数量为ai,小易希望知道从左往右数第x个苹果是属于哪一堆的。 牛牛觉得问题太简单了,所以希望你来替他回答。
第一行 一个数 n (1<= n <= 10^5)
第二行 n个数 ai (1<=ai<=1000),表示从左往右数第i堆有多少苹果
第三行 一个数m (1<= m <= 10^5),表示有m次询问
第四行 m个数qi, 表示小易希望知道第qi个苹果属于哪一堆。
m行,第i行输出第qi个苹果属于哪一堆。
输入
5
2 7 3 4 9
3
1 25 11
输出
1
5
3
对苹果数量求累加和,然后运用二分查找即可
import java.util.Arrays;
import java.util.Scanner;
public class fengshou {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] apple = new int[n+1];
int cur = 0;
for (int i=1;i<=n;i++){
cur += sc.nextInt();
apple[i] = cur;
}
int m = sc.nextInt();
while (m-->0){
//Arrays.binarySearch() 如果没有查找到值: return -(low + 1); // key not found.
//只要拿到 low 的值即可输出
int index = Arrays.binarySearch(apple,sc.nextInt());
if (index < 0){
System.out.println(-index-1);
}
else {
System.out.println(index);
}
}
}
}
import java.util.Arrays;
import java.util.Scanner;
public class fengshou {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] apple = new int[n+1];
int cur = 0;
for (int i=1;i<=n;i++){
cur += sc.nextInt();
apple[i] = cur;
}
int m = sc.nextInt();
while (m-->0){
//Arrays.binarySearch() 如果没有查找到值: return -(low + 1); // key not found.
//只要拿到 low 的值即可输出
//int index = Arrays.binarySearch(apple,sc.nextInt());
int index = binarySearch(apple,sc.nextInt());
if (index < 0){
System.out.println(-index-1);
}
else {
System.out.println(index);
}
}
}
private static int binarySearch(int[] apple, int k){
int start = 1; int end = apple.length-1;
int mid = start - (start-end)/2;
while (start <= end){
if (apple[mid]>k){
end = mid-1;
}
else if (apple[mid]1;
}
else {
return mid;
}
mid = start - (start-end)/2;
}
return start;
}
}
给你n个a,m个z组成所有可能的字符串,并将字符串按字典序从小到大排列,输出第k个字符串。
若不存在,输出-1。
第一行为三个数,分别为a的个数n,z的个数m,第k个字符串。
第k个字符串
输入
2 2 6
输出
zzaa
import java.util.*;
public class test {
private static TreeSet res = new TreeSet<>();
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {//注意while处理多个case
int n = in.nextInt();
int m = in.nextInt();
int k = in.nextInt();
char[] s = new char[n+m];
for (int i=0;i'a';
}
for (int i=n;i'z';
}
getMax(s,0,n+m-1);
Iterator itSet = res.iterator();
while (itSet.hasNext() && k-->0){
itSet.next();
if (k==1) System.out.println(itSet.next());
}
}
}
private static void getMax(char[] array,int i , int n){
//全排列,回溯法:递归+循环
if(i == array.length){//该组合排列完全,可以计算
res.add(String.valueOf(array));
}
else{
for(int k =i;k<=n;k++){//回溯
swap(array,k,i);
getMax(array,i+1,array.length-1);
swap(array,k,i);
}
}
}
private static void swap(char[] array,int i, int j){
char temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
package Interview.wangyi.wangyi_0811;
import java.util.ArrayList;
import java.util.Scanner;
public class zifuchuan {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int k = in.nextInt();
ArrayList list = new ArrayList<>();
//深度优先存储所有字符串,然后取出第k个字符串
dfs(n,m,list,"");
if (list.size()1);
}
else {
System.out.println(list.get(k-1)); //从0开始
}
}
//此处DFS ,对它进行了剪枝,循环次数大大减少,但是依然不适合数据量大的时候
private static void dfs(int n , int m , ArrayList list,String s){
if (m==0 && n==0){
list.add(s);
}
else {
if (n>0){
dfs(n-1,m,list,s+'a');
}
if (m>0){
dfs(n,m-1,list,s+'z');
}
}
}
}
import java.util.Scanner;
public class zifuchuan2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int k = in.nextInt();
//构建dp数组,计算每种选择下的组合而成的字符串个数
int[][] dp = new int[n+1][m+1];
//假设dp[i][j]表示i个a和j个z的方案数,根据上面这个公式列表计算我们可以发现:d[i][j] = dp[i-1][j] + dp[i][j-1];
dp[0][0] = 1;
for (int i=0;i<=n;i++){
dp[i][0] = 1;
}
for (int j=0;j<=m;j++){
dp[0][j] = 1;
}
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
StringBuilder sb = new StringBuilder();
//假设我们现在考虑输出字符串的第i个字符,如果当前选了a字符
//假设后面剩余字符a和z的个数是m1,n1,那么后面所能组成的字符串总数为dp[m1][n1]
//如果k小于dp[m1][n1],那么我们就能选a,因为后面组成的数目大于k,我们要选字符a来缩小这个组合数
//否则,就选z,这时k -= dp[m1][n1],这是因为要减去a形成的方案数
if (k>dp[n][m]){
System.out.println(-1);
}
else {//计算出 第 k 个字符
int n1 = n;
int m1 = m;
for (int i=0;i//字符串长度
if (n1>0 && k<=dp[n1-1][m1]){//可以添加 a 到字符串中
sb.append("a");
n1--;
}
else {
if (n1>0){//减去形成 a 形成的方案数
k -= dp[n1-1][m1];
}
sb.append("z");
m1--;
}
}
}
System.out.println(sb.toString());
}
}