日常刷题

codeforce-C. Brutality

https://codeforc.es/contest/1107/problem/C
You are playing a new famous fighting game: Kortal Mombat XII. You have to perform a brutality on your opponent’s character.

You are playing the game on the new generation console so your gamepad have 26 buttons. Each button has a single lowercase Latin letter from ‘a’ to ‘z’ written on it. All the letters on buttons are pairwise distinct.

You are given a sequence of hits, the i-th hit deals ai units of damage to the opponent’s character. To perform the i-th hit you have to press the button si on your gamepad. Hits are numbered from 1 to n.

You know that if you press some button more than k times in a row then it’ll break. You cherish your gamepad and don’t want to break any of its buttons.

To perform a brutality you have to land some of the hits of the given sequence. You are allowed to skip any of them, however changing the initial order of the sequence is prohibited. The total damage dealt is the sum of ai over all i for the hits which weren’t skipped.

Note that if you skip the hit then the counter of consecutive presses the button won’t reset.

Your task is to skip some hits to deal the maximum possible total damage to the opponent’s character and not break your gamepad buttons.

Input
The first line of the input contains two integers n and k (1≤k≤n≤2⋅105) — the number of hits and the maximum number of times you can push the same button in a row.

The second line of the input contains n integers a1,a2,…,an (1≤ai≤109), where ai is the damage of the i-th hit.

The third line of the input contains the string s consisting of exactly n lowercase Latin letters — the sequence of hits (each character is the letter on the button you need to press to perform the corresponding hit).

Output
Print one integer dmg — the maximum possible damage to the opponent’s character you can deal without breaking your gamepad buttons.

Examples
inputCopy
7 3
1 5 16 18 7 2 10
baaaaca
outputCopy
54
inputCopy
5 5
2 4 1 3 1000
aaaaa
outputCopy
1010
inputCopy
5 4
2 4 1 3 1000
aaaaa
outputCopy
1009
inputCopy
8 1
10 15 2 1 4 8 15 16
qqwweerr
outputCopy
41
inputCopy
6 3
14 18 9 19 2 15
cccccc
outputCopy
52
inputCopy
2 1
10 10
qq
outputCopy
10
Note
In the first example you can choose hits with numbers [1,3,4,5,6,7] with the total damage 1+16+18+7+2+10=54.

In the second example you can choose all hits so the total damage is 2+4+1+3+1000=1010.

In the third example you can choose all hits expect the third one so the total damage is 2+4+3+1000=1009.

In the fourth example you can choose hits with numbers [2,3,6,8]. Only this way you can reach the maximum total damage 15+2+8+16=41.

In the fifth example you can choose only hits with numbers [2,4,6] with the total damage 18+19+15=52.

In the sixth example you can change either first hit or the second hit (it does not matter) with the total damage 10.
题意:给n个数表示伤害,长度n的字符串命令执行,s[i]则受到对应的数字a[i]点伤害;同一个不能连续超过k次使用(有其他字符隔开可以继续用)问最大伤害;
* 因为java语言scanner方法输入数据太慢,做一些题的时候容易超时,故而用了BufferedReader。
* 其中PriorityQueue 队列的头指排序规则最小那个元素。如果多个元素都是最小值则随机选一个。
* 运用poll函数返回队列队首位置数字,即最小值



import java.io.*;
import java.util.*;
public class E3
{
    public static void main(String[] args) throws IOException
    {
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 
        int i,N;
 
        String s[]=br.readLine().trim().split(" ");
        N=Integer.parseInt(s[0]);
        int K=Integer.parseInt(s[1]);
 
        int[] a=new int[N];
        s=br.readLine().trim().split(" ");
        for(i=0;i<N;i++) a[i]=Integer.parseInt(s[i]);
 
        PriorityQueue<Integer> PQ=new PriorityQueue<>();
        long sum=0;
        char str[]=br.readLine().trim().toCharArray();
 
        char cur='$';
        for(i=0;i<N;i++)
        {
            if(str[i]!=cur) PQ.clear();
            cur=str[i]; PQ.add(a[i]);
            sum+=a[i];
            if(PQ.size()>K) sum-=PQ.poll();
        }
        System.out.println(sum);
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值