这是我第二次参加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两题的切题报告就这样。
欢迎各位大佬前来指出错误