Codeforcesラウンド#623(ディビジョン2、VKカップ2019から2020に基づいて - 。エリミネーションラウンド、エンジン)

B - 帰郷

長いパーティーの後ペチャは帰国することを決めたが、彼は彼の家から町の反対側にあることが判明しました。町の行にnnは十字路があり、バスまたは各交差点でのトラム駅のどちらかがあります。

二番目の交差点でトラムステーションがある場合に交差点は、二番目の交差点でバスステーションがある場合、SIは、A =長さNNの列SSとして表され、SI = Bれます。現在、ペチャは(S1S1に対応)最初の交差点にあり、彼の目標は、(SNSNにこれに相当する)最後の交差点に取得することです。

2つの交差点IIおよびすべての交差点I、I + 1、...、J-1IのためのJJのための場合はバス停があり、J-1、I + 1、...、1はバスの切符のためのAAルーブルを支払う、とから行くことができます二番目のバスでJJ番目の交差点までの交差点(JJ番目の交差点でバスステーションを有する必要はありません)。正式には、払っAAのルーブルペチャは、ST = Aの場合、すべてのi≤t<jについてJJにIIから行くことができます。

もし私が、私は+ 1、...、J-1は、トラムの駅があり、1は、路面電車の切符のためのBBルーブルを支払うと、ii番目の交差点からJJ番目の交差点に行くことができ、すべての交差点には2つの交差点IIおよびJJについてトラムで(JJ番目の交差点でトラムステーションを有する必要はありません)。正式には、ルーブルのb-b払っペチャがjにIIから行くことができるならばST =のBst =すべてi≤t<jに対してB。

例えば、SS =「AABBBAB」は、= 4A = 4、B = 3(b)= 3次にペチャが必要な場合:
ここに画像を挿入説明

、1から3に到達するために一つのバスチケットを購入し
、3から6に到達するために1枚のトラムの切符を買う
6から7に到達するために一つのバスチケットを購入し
、合計で彼は4 + 3 + 4 = 11ルーブルを過ごすために必要があり、このように。ノートは(つまり、文字SNSN)最後の交差点での停止の種類は、最終的な費用に影響を与えませんしてくださいということ。

今ペチャは、最初の交差点にあり、彼はNN番目の交差点を取得したいです。パーティーの後、彼は、PPルーブルを残しました。彼は足にいくつかの駅に行き、その後、唯一の公共交通機関を利用して家に行くことにしています。

彼は唯一の路面電車やバスのチケットを使用して、n番目のi番目の交差点から取得するための十分なお金を持っているので、ヘルプ、彼は、私が最初に歩いて行くには、最も近い交差点を選択します。

入力は、
各テストは、1つ以上のテストケースが含まれています。最初の行は、テストケースT(1≤t≤104)の数を含んでいます。

バスチケットのコスト、トラムチケットのコストとペチャが持つ金額 - 各テストケースの最初の行は三つの整数、B、PA、B、P(1≤a、B、p≤105)から成り。

二番目の交差点(2≤でトラム局が存在する場合、各テストケースの2行目には、1つの文字列のi番目の交差点でバスステーションがある場合、SIは、Aが= SS、及びSi = Bで構成され| S |≤105)。

一つの試験ですべてのテストケースによって、文字列SSの長さの合計が105を超えていないことを、保証されています。

出力
各テストケースの印刷1番号の場合-私ペチャは徒歩で行くべき交差点の最小インデックス。パスの残りの部分(すなわちIIからのnに彼は公共交通機関を使用する必要があります)。

例えば
入力
5。
2 2 1
BB
1. 1. 1。
AB
3 2. 8。
AABBBBAABB
5 3 4。
BBBBB
2. 1. 1
ABABAB
出力
2
1。
3。
1。
6。
タイトル効果:ペチャのP-ルーブル、彼は町の一端からの町へのバスや地下鉄を取る必要がありますもう一方の端、バス停があり、Bは、地下鉄の駅で、ペチャサイトオフバス上の異なる部位に、バス停のルーブルを必要とし、bは地下鉄駅の必要性のルーブルで、ペチャの必要が家に来て、車が連続することができ余分な電車のサイトはありませんし、彼は少なくとも行く必要がどのように多くの手順尋ねました。
アイデアを問題解決:
我々の直接乗って自宅ので、その後、直接自宅から逆の順序がそれにかけてサイトだけで十分なお金やわずか数ステップを見つけるために、

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--){
        int a=0,b=0,p=0;
        int np=0,flag=0,j=0,step=0;		///np此时坐车已花费的钱数,flag 0 1判断最后一站足额还是超额
        char s[100001]={0},c={0};	///c用于存储最后一站,避免重站下车
        cin>>a>>b>>p;
        scanf("%s",s);
        int l=strlen(s);
        for(int i=l-2;i>=0;i--){
            if(s[i]=='A'&&c!=s[i]){
                np+=a;
            }
            if(s[i]=='B'&&c!=s[i]){
                np+=b;
            }
            c=s[i];
            if(np>p){				///超额
                j=i+1;
                flag=2;
                break;
            }
            if(np==p){			   ///足额
                j=i;
                flag=1;
                break;
            }

        }
        if(flag==1){				///因为是倒序所以最后一站仅仅遍历到了尾站,例如AAAAB,最后一站为A,但只遍历到第4个A,所需为第一个A的位置需再次遍历
            for(int i=j;i>=0;i--){
                if(s[i]==c){
                    step=i;
                }
                else{
                    break;
                }
            }
        }
        if(flag==2){
            step=j;
        }
        printf("%d\n",step+1);
    }
}

公開された12元の記事 ウォンの賞賛0 ビュー163

おすすめ

転載: blog.csdn.net/qq_45981086/article/details/104512904