Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

A. Single Wildcard Pattern Matching

题目链接:A. Single Wildcard Pattern Matching

题意:给定两个字符串,第一个字符串至多含有一个*,然后可以把*替换成一个任意的字符串,求这两个字符串是否匹配。

思路:首先判断是否含有'*',没有则直接判断两个string是否相等,有则从前到'*'遍历一次,从后到'*'遍历一次,看是否存在不等的字符。

AC代码:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main (void)
{
    string s,t;
    int n,m;
    while(cin>>n>>m)
    {
        cin>>s>>t;
        int arc = 0;
        for(int i = 0; i < s.size(); i++)
            if(s[i] == '*')
            {
                arc = 1;
                break;
            }
        if(arc == 0)
        {
            if(s==t)
                cout<<"YES";
            else
                cout<<"NO";
        }
        else
        {
            if(s.size()-1>t.size())
                cout<<"NO";
            else
            {
                int i = 0;
                while(s[i]!='*')
                {
                    if(s[i]!=t[i])
                    {
                        arc = 2;
                    }
                    i++;

                }
                i = 1;
                while(s[s.size()-i]!='*')
                {
                    if(s[s.size()-i]!=t[t.size()-i])
                    {
                        arc = 2;
                    }
                    i++;

                }
                if(arc == 1)
                cout<<"YES";
                if(arc == 2)
                cout<<"NO";
            }

        }

    }
    return 0;
}
solve

 

 

B. Pair of Toys

题目链接:B. Pair of Toys

题意:给你一个数列1-n,给你一个期望值k,让你求用任意数列中两个数得到k的种类有多少。

思路:  分成四种情况讨论即可。

1.k>=2*n,直接GG。

2.n<k<2*n,pair = (k+1)/2

3.n>k,pair = (2n-k+1)/2

4.n==k,如果k是偶数,pair == (k-1)/2;

    如果k是奇数,pair == k/2;

 

AC代码:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main (void)
{
    long long int n, k;
    while(cin>>n>>k){
    if(n*2<=k)
        cout<<0;
    else if(n<k){
        long long int min;
        min = k-n;
        cout<<(n-min+1)/2;
    }
    else if(n>k){
        long long int max;
        max = k-1;
        cout<<(max/2);
    }
    else{
        if(k%2==0)
            cout<<(k-1)/2;
        else
            cout<<k/2;
    }
    }
    return 0;
}
solve

 

C. Bracket Subsequence

题目链接:C. Bracket Subsequence

题意&思路:括号的匹配,栈使用的基本问题。

AC代码:

#include <iostream>
#include <vector>
#include <string>
#include <stack>

using namespace std;

int main (void)
{
    int n, k;
    while(cin>>n>>k)
    {
        string s;
        cin>>s;
        stack<char> stk, stk2;
        int count = 0;
        int i = 0;
        for(i = 0; i < n; i++)
        {
            if(s[i] == ')'){
                stk.pop();
                count = count+2;
            }
            else
                stk.push(s[i]);
            if(count == n - k)
                break;
        }
        i++;
        for(;i<n;i++){
            stk.push(s[i]);
        }
        while(!stk.empty())
        {
            stk2.push(stk.top());
            stk.pop();
        }
        while(!stk2.empty())
        {
            cout<<stk2.top();
            stk2.pop();
        }
    }

    return 0;
}
solve

 

posted @ 2018-08-18 09:55  Lokianyu  阅读(89)  评论(0)    收藏  举报