牛客 题解

文章目录


day4_17

BC149 简写单词

https://www.nowcoder.com/practice/0cfa856bf0d649b88f6260d878f35bb4?tpId=290\&tqId=39937\&ru=/exam/oj

j

思路:模拟
代码:
java 复制代码
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            char c = in.next().charAt(0);
            if(c>='a'&&c<='z'){
                System.out.print((char)(c-32));
            }else{
                System.out.print(c);
            }
        }
    }

dd爱框框

https://ac.nowcoder.com/acm/contest/11211/F

思路:滑动窗口(同向双指针)

1.从1开始计数的

2.区间内的数字必须严格大于0,因为如果区间中存在小于0的数,left在滑动的时候,可能会增大,会倒逼right回退。只有严格大于0的数,随着left滑动,区间之和才会减小。right就会向后移动。

  • 进窗口:sum += arr[right]

  • 判断条件:sum >=x

  • 更新结果:right-left+1 < retlen retleft = left, retright = right

  • 出窗口:sum-= arr[left]

代码:
java 复制代码
import java.util.*;
import java.io.*;
public class Main{
    public static void main(String[] args )throws IOException{
        Read in = new Read();
        int n = in.nextInt(),x = in.nextInt();
        int[]arr = new int[n+1];
        for(int i = 1; i<=n ; i++){
            arr[i] = in.nextInt();
        }
        int left = 1,right = 1,sum = 0;
        int retleft = -1,retright = -1,retlen = n;
        while(right<=n){
            //进窗口
            sum += arr[right];
            while(sum>=x){
                //更新结果
                if(right-left+1 < retlen){
                    retleft = left;
                    retright = right;
                    retlen = right-left+1;
                }
                sum -= arr[left++];//出窗口
            }
            right++;
        }
        System.out.println(retleft+" "+retright);  
    }
}
class Read{
    StringTokenizer st = new StringTokenizer("");
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String next()throws IOException{
        while(!st.hasMoreTokens()){
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }
    String nextLine()throws IOException{
        return bf.readLine();
    }
    int nextInt()throws IOException{
        return Integer.parseInt(next());
    }
    long nextLong()throws IOException{
        return Long.parseLong(next());
    }
    double nextDouble()throws IOException{
        return Double.parseDouble(next());
    }
}

除2!

https://ac.nowcoder.com/acm/contest/8563/A

思路:模拟+贪心+堆

1.优先级队列确保出队的都是最大值

2.如果出队/2之后仍是偶数,再次进队。

代码:
java 复制代码
import java.util.*;
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        PriorityQueue<Integer> heap = new PriorityQueue<>((a,b)->{
            return b-a;
        });
        long sum = 0,x;
        for(int i = 0; i<n; i++){
            x = in.nextLong();
            sum += x;
            if(x%2 == 0){
                heap.add((int)x);
            }
        }
        while(k-- != 0 && !heap.isEmpty()){
            long t = heap.poll() / 2;
            sum -= t;
            if(t%2 == 0){
                heap.add((int)t);
            }
        }
        System.out.println(sum);
    }
}

点击移步博客主页,欢迎光临~

相关推荐
Sylvia-girl16 分钟前
IO流~~
java·开发语言
冰暮流星29 分钟前
javascript之数组
java·前端·javascript
Re.不晚33 分钟前
JAVA进阶之路——无奖问答挑战3
java·开发语言
代码游侠33 分钟前
C语言核心概念复习——C语言基础阶段
linux·开发语言·c++·学习
㓗冽42 分钟前
60题之内难题分析
开发语言·c++·算法
dingdingfish1 小时前
Bash学习 - 第3章:Basic Shell Features,第5节:Shell Expansions
开发语言·学习·bash
rainbow68891 小时前
C++开源库dxflib解析DXF文件实战
开发语言·c++·开源
不倒翁玩偶1 小时前
IDEA导入新的SpringBoot项目没有启动按钮
java·spring boot·intellij-idea
deepxuan1 小时前
Day7--python
开发语言·python
小小小米粒1 小时前
Maven Tools
java