Codeforces - 1107B. Digital root & 1107C. Brutality(规律 & 贪心)

Codeforces - 1107B. Digital root & 1107C. Brutality(规律 & 贪心)


Codeforces - 1107B. Digital root

题目链接
题目

一个数x数根的定义S(x)是如题目中给出的样子(就是一个数不断的将各个位上的数相加得到一个新的数(直到这个数为个位数)),现在给你两个数k、x要你求出第k个数根是x的非负整数。
在这里插入图片描述

解析

想半天没有思路,其实是一道找规律的水题。。

先将前面的结果打表,求出每个数对应的数根,即可以发现规律:

  • 是一个以9为周期的循环,每个周期的结果都是1 ~ 9
  • 于是很容易得到结果(k- 1) * 9 + x

在这里插入图片描述
结果代码以及打表代码:

import java.io.*;
import java.util.*;

public class Main {

    static long getSum(long p){ 
        if(p == 0)
            return 0;
        return getSum(p/10) + p%10;
    }

    static long getRoot(long p){ 
        if(p < 10)
            return p;
        return getRoot( getSum(p) );
    }

    static void test(){ 
        // Bymeter 
        for(int i = 0; i < 100; i++)
            System.out.println( i + " " + getRoot(i) );
    }

    public static void main(String[] args){
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        PrintStream out = System.out;
        //test();
        int n = cin.nextInt();
        for(int i = 0; i < n; i++){ 
            long k = cin.nextLong();
            int x = cin.nextInt();
            out.println( (k-1) * 9 + x);
        }
    }
}

Codeforces - 1107C. Brutality

题目链接
题目

给你n、k,然后n个数(arr[i])以及长度为n的字符串(str[i]),每次你可以拿走某个位置i上的字符,得到的价值是arr[i],但是你在一段连续的相同的字符序列中,不能拿超过k个字符串(注意,不是连续的k个)。问你可以拿到的最大价值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

解析

一开始没有读懂题目,即: 在一段连续的相同的字符序列中,不能拿超过k个字符串,还以为是总共不能超过k个字符串,于是用map + 堆写了,那时还纳闷第一个样例不对,后来才看懂题目的意思。。。

  • 遍历字符串,每次去找相同连续相同的字符序列;
  • 然后对这一段字符序列对应的值排序,取最大的k个即可(不够的话就取所有的);

在这里插入图片描述

一开始错误的代码:

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        PrintStream out = System.out;
        int n = cin.nextInt();
        int k = cin.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++)
            arr[i] = cin.nextInt();
        String str = cin.next();

        HashMap<Character, PriorityQueue<Integer>> counts = new HashMap<>();
        for (int i = 0; i < n; i++) {
            char c = str.charAt(i);
            PriorityQueue<Integer> tmpQ = counts.getOrDefault(c, new PriorityQueue<>());
            if (tmpQ.size() >= k) {
                if (arr[i] > tmpQ.peek()) {
                    tmpQ.poll();
                    tmpQ.add(arr[i]);
                }
            } else {
                tmpQ.add(arr[i]);
            }
            counts.put(c, tmpQ);
        }
        int res = 0;
        for(PriorityQueue<Integer>q : counts.values()){
            while(!q.isEmpty())
                res += q.poll();
        }
        System.out.println(res);
    }
}

最后修改的正取的代码:

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner cin = new Scanner(new BufferedInputStream(System.in));
        PrintStream out = System.out;
        int n = cin.nextInt();
        int k = cin.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++)
            arr[i] = cin.nextInt();
        String str = cin.next();
        long res = 0;
        for (int i = 0; i < n; ) {
            char c = str.charAt(i);
            int j = i;
            List<Integer> tmp = new ArrayList<>();
            while (j < n && str.charAt(j) == c) {
                tmp.add(arr[j]);
                j++;
            }
            Collections.sort(tmp, Collections.reverseOrder());
            for (int p = 0; p < Math.min(tmp.size(), k); p++) res += tmp.get(p);
            i = j;
        }
        System.out.println(res);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值