Codeforces Round #704 (Div. 2) 题解 (A-C)

A. Three swimmers

题意

有三个人再泳池左边,游泳一圈需要时间a,b,c,你在p分钟到泳池左边,你需要等几分钟才能有人到泳池左边?

题解

签到题,直接算就行了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define imax 0x3f3f3f3f
#define lmax 0x3f3f3f3f3f3f3f3f
ll max(ll a, ll b) {
    if (a > b) return a;
    return b;
}
ll min(ll a, ll b) {
    if (a < b) return a;
    return b;
}
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int _;
    cin>>_;
    while(_--){
        ll p,a,b,c;
        cin>>p>>a>>b>>c;
        ll a1,b1,c1;
        if(p%a==0||p%b==0||p%c==0){
            cout<<0<<endl;
            continue;
        }
        else{
            a1=p/a+1;
            b1=p/b+1;
            c1=p/c+1;
            cout<<min(a*a1-p,min(b*b1-p,c*c1-p))<<endl;
        }
    }
    return 0;
}

B. Card Deck

题意

有n张卡片,你每次可以从顶部取任意张(顺序不变)放在新一堆卡片的顶部,求取得最大价值的顺序。

题解

我们每次都让未取卡片中的最大值在前面,这样就能保证计算得到的价值最大。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define imax 0x3f3f3f3f
#define lmax 0x3f3f3f3f3f3f3f3f
int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int _;
    cin>>_;
    while(_--){
       int n;
       cin>>n;
       int num[n];
       set<int> s;
       for(int i=0;i<n;i++){
            cin>>num[i];
            s.insert(num[i]);
       }
       int b=n-1;
       while(s.size()!=0){
            int m=*(s.rbegin());
            int i;
            for(i=b;i>=0;i--){
                if(num[i]==m) break;
            }
            int swa=i-1;
            for(;i<=b;i++){
                cout<<num[i]<<" ";
                s.erase(num[i]);
            }
            b=swa;
       }
       cout<<endl;
    }

    return 0;

}

C. Maximum width

题意

给出两个长度分别为n、m字符串s、t,从s中按顺序找出m个字符组成t,使得其中两个相邻的字符下标之差最大。

题解

首先在s中找到t[0]和t[m-1]所在的位置,作为查找的起始点和终点。然后找出在s中从起始点按顺序找到剩余t中的字符的下标,再从终点倒序找出剩余t中的字符的下标,之后两两相减,取最大值。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define imax 0x3f3f3f3f
#define lmax 0x3f3f3f3f3f3f3f3f
int main(void)
{

    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int n,m;
    cin>>n>>m;
    string s,t;
    cin>>s;
    cin>>t;
    int l,r;
    for(int i=0;i<n;i++){
        if(s[i]==t[0]) {
            l=i;
            break;
        }
    }
    for(int i=n-1;i>=0;i--){
        if(s[i]==t[m-1]) {
            r=i;
            break;
        }
    }
    if(m==2){
        cout<<r-l<<endl;
        return 0;
    }
    int j=m-2,num[m],num2[m];
    num2[0]=l;
    num[m-1]=r;
    for(int i=r-1;i>=0;i--){
        if(s[i]==t[j]){
            num[j]=i;
            j--;
            if(j==0) break;
        }
    }
    j=1;
    for(int i=l+1;i<n;i++){
        if(s[i]==t[j]){
            num2[j]=i;
            j++;
            if(j==m-1) break;
        }
    }
    //for(int i=0;i<m;i++)cout<<num[i]<<" ";
   // cout<<endl;
    //for(int i=0;i<m;i++)cout<<num2[i]<<" ";
    //cout<<endl;
    int ma=0;
    for(int i=0;i<m-1;i++){
        ma=max(num[i+1]-num2[i],ma);
    }
    cout<<ma<<endl;
    return 0;

}

题目来源于https://codeforces.com/contest/1492

知识共享许可协议
Text is available under CC BY-NC-SA 4.0 unless otherwise stated.

除非特殊声明,本站所有内容均以 CC BY-NC-SA 4.0协议授权。
上一篇
下一篇