Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)切题报告(A-B题)

这是我第二次参加CF比赛,也是第一次写博客,写得不好,望各位大佬海涵。

A. Single Wildcard Pattern Matching
原题链接
这道题,这是难到让人无法直视,太水了。
题目大意是这样的:给你两个字符串s和t,字符串s长n,字符串t长m,在s中可能会有字母和号,号最多只有一个,t中只会有字母,字母都是小写字母,现在告诉你*号可以编程任意多个小写字母或者删除,请问能不能由s变成t。

思路:暴力+模拟
总体来说,我们就是逐个比对,如果S从前到*号与T的相同个数的字母完全相等,从后往前也是如此的话那么我们可以判定这两个数组符合要求。

代码:

#include<iostream>
using namespace std;

int main()
{
    int n,m;
    cin>>n>>m;


    char a[n+5],b[m+5];
    cin>>a;
    cin>>b;
    int s1=0;

    if(m<n-1) //如果t数组太短了,比s数组减掉一个*号也就是n-1还短的话,那么这两个字符串必然不符合要求。
    {
        cout<<"NO"<<endl;
        return 0;
    }

    for(int i=0;i<n;i++)  //扫描s数组,计算从头开始一直到*号有多少个数存到s1里
    {
        if(a[i]!='*')
        {
            s1++;
        }
        if(a[i]=='*')
        {
            break;
        }
    }

    char c[n+5];
    for(int i=0;i<s1;i++) //把t数组的前s1个数存到c中
    {
        c[i]=b[i];
    }

    for(int i=0;i<s1;i++)  //开始比对,如果不相等则比对失败,输出“NO”
    {
        if(c[i]==a[i])
        {

        }
        else
        {
            cout<<"NO"<<endl;
            return 0;
        }
    }

    if(s1==n && m>n) //这是一个特判,如果s1==n则意味着s数组中没有*,那么意味着如果t比s长,那么这两个数组也无法相等(我在这儿被坑过)
    {
        cout<<"NO"<<endl;
        return 0;
    }

    int ff=m-1;
    for(int i=n-1;i>=s1+1;i--)  //反着搜,如果不相等则停止
    {
        if(a[i]==b[ff])
        {
            ff--;
        }
        else
        {
            cout<<"NO"<<endl;
            return 0;
        }
    }
    cout<<"YES"<<endl;  //好了,能撑到这一步的都是符合要求的,输出“YES”来终止程序吧。
    return 0;
}

B:Pair of Toys
原题链接
题意:有一个商店,商店里有n件物品,第i件物品的价格是i,现在有一个人,手上有k元,他(她)想买2件物品并且要把钱花完,问有几种方法(注:每件物品只有1件,不可重复购买),如果没有办法就输出0。

思路:这是一道数学题,详情看代码

#include<iostream>
using namespace std;

int main()
{
    __int64 n,k;  //因为数据范围比较大,所以我选择了__int 64,如果有人想,也可以选择高精度。
    cin>>n>>k;
    if(n-1+n<k) //如果最贵的两件物品(n与n-1)加起来都达不到k,则肯定没有办法花完这k元,所以直接输出0即可
    {
        cout<<'0'<<endl;
        return 0;
    }

    if(k>n) //如果k比最贵的物品(n)贵,那么我们的答案就是(n-(k-n)+1)/2  (下取整)
    {
        unsigned __int64 m=k-n;  
        unsigned __int64 o=n-m+1;
        cout<<(unsigned __int64)o/2<<endl;  //因为数据量比较大,为了防止溢出,我们选择强制类型转换成(unsigned __int64)
    }
    else  //如果k比最贵的物品便宜或者正好等于,那么n就要比k小1,否则如果n==k,这样就只能买一件物品,不符合题目要求,so我们的答案是(和上面一样)(n-(k-n)+1)/2  (下取整)
    {
        n=k-1;
        unsigned __int64 m=k-n;
        unsigned __int64 o=(n-m+1);
        cout<<(unsigned __int64)o/2<<endl;
    }

    return 0;
}

好了,关于Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)的A、B两题的切题报告就这样。
欢迎各位大佬前来指出错误

猜你喜欢

转载自blog.csdn.net/zizi0092011/article/details/81836674