Educational Codeforces Round 59 (Div. 2)

Educational Codeforces Round 59 (Div. 2)

A. Digits Sequence Dividing

题意:给一个整数串s,分成至少两份,大小依次严格递增。(1≤q≤300,2≤|s|≤300)

思路:分成两份,第一位分给第一份,余下分给第二份。

#include <bits/stdc++.h>
using namespace std;
void solve(){
    int n;string s;cin>>n>>s;
    string s1=s.substr(0,1),s2=s.substr(1);
    if(s2.size()>s1.size()||s2[0]>s1[0])
        cout<<"YES\n"<<"2\n"<<s1<<' '<<s2<<"\n";
    else cout<<"NO\n";
}
int main()
{
    int t;cin>>t;
    while(t--)
        solve();
    return 0;
}
View Code

B. Digital root

题意:一个数的数根为取所有位之和构成新数直至只有一位。给出k,x,试求数根为x的第k个数。(1≤q

≤103,1≤k≤1012,1≤x≤9)

思路:每次+9,原理见:数根(digital root)公式的推导

#include <bits/stdc++.h>
using namespace std;
void solve(){
    long long k,x;cin>>k>>x;
    cout<<(k-1)*9+x<<"\n";
}
int main()
{
    int t;cin>>t;
    while(t--)
        solve();
    return 0;
}
View Code

C. Brutality

题意:给出一个操作序列和每次操作的伤害,相同操作最多连续k次,试求所能造成的最大伤害。

思路:双指针局部排序。

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n,k;cin>>n>>k;
    int d[n];for(int &i:d) cin>>i;
    string s;cin>>s;
    long long sum=0;
    for(int l=0,r=0;l<n;l=r){
        while(r<n&&s[r]==s[l]) ++r;
        sort(d+l,d+r,greater<int>());
        for(int i=l;i<min(r,l+k);i++)
            sum+=d[i];
    }
    cout<<sum<<"\n";
    return 0;
}
View Code

 

posted @ 2020-03-23 18:38  Kanoon  阅读(139)  评论(0)    收藏  举报