$Codeforces; Round; 504; (Div.2)$
Posted wxl-ezio
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了$Codeforces; Round; 504; (Div.2)$相关的知识,希望对你有一定的参考价值。
宾馆的( m{wifi})也太不好了,蹭的(ZZC)的热点才打的比赛(感谢(ZZC))
日常掉rating…… 我现在是个(color{green}{pupil})……
因为我菜,所以还是只写了前三道题
题解
(mathcal{A.Single; Wildcard; Pattern; Matching})
题目大意:有点长,不想翻译了qwq
我能说第一题是前三道题中最难的么……各种特判,各种被卡,最后交了4遍也没做出来(我太蒟了 QAQ)
反复修改后的冗杂的AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int n,m; cin>>n>>m; n-=1,m-=1;
if(n>m+1){
cout<<"NO"; return 0;
}
char s1[200010],s2[200010]; cin>>s1>>s2;
int pos=0;
for(int i=0;i<=n+1;i++){
pos=i;
if(s1[i]=='*') break;
}
//cout<<pos;
for(int i=0;i<pos;i++){
if(s1[i]!=s2[i]){
cout<<"NO"; return 0;
}
}
if(pos==n+1){
if(n!=m){
cout<<"NO"; return 0;
}
goto hhh;
}
int j;
for(j=0;;j++){
if(n-j==pos) break;
if(s1[n-j]!=s2[m-j]){
cout<<"NO"; return 0;
}
}
for(int i=pos;i<m-j;i++){
if(s2[i]<'a'||s2[i]>'z'){
cout<<"NO"; return 0;
}
}
hhh:
cout<<"YES";
return 0;
}
(mathfrak{B.Pair; of; Toys})
题目大意:输入两个数(n,k),问从(1 ext{~}n)中取出(2)个数使得它们的和为(k)的方案数(((a,b))和((b,a))算同一种方案)
这题算是数论吧……挺简单的
如果(a+b==k),那么((a+1)+(b-1),(a+2)+(b+2))……也等于(k)。所以我们可以找到最接近的两个数(k/2,k/2+1),然后(1 ext{~}k/2)和((k/2+1) ext{~}(k{-}1))就是所有的方案。接下来我们只需要找出合法的方案数就可以了
首先我们可以确定如果(k/2{>=}n),肯定无解,当(k/2{<}n)的时候,因为(n)可能小于(k),所以合法的方案数应为(min(k/2,(k-1)-k/2,n-k/2))
P.S. 不要忘了开(long; long)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
long long n,k; cin>>n>>k;
long long mid=k/2,ans;
if(mid<n) ans=min(mid,min(k-1-mid,n-mid));
else{
cout<<0; return 0;
}
cout<<ans;
return 0;
}
(sf{C.Bracket; Subsequence})
题目大意:给你一个长度为(n)括号序列(a),找出一段长度为(m)合法的括号序列(b),使得(b)是(a)的子串
(b)为答案,我们枚举(a)的每一个括号,每扫到一个括号,就把它加入(b)里,如果为左括号,(cnt{+}{=}1),如果(cnt==m/2)就跳出循环,然后从后面补右括号就行了
没初始化(ans)数组,FST了…… QAQ
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int n,m; cin>>n>>m; m/=2;
char a[200010],b[200010]; cin>>a;
memset(b,0,sizeof(b));
int len=strlen(a)-1,tot=0,cnt=0;
for(int i=0;i<=len;i++){
if(a[i]=='('){
b[tot++]='(';
cnt++;
}
if(cnt==m) break;
if(a[i]==')'){
b[tot++]=')';
}
}
for(int i=tot;i<m*2;i++) b[i]=')';
cout<<b;
return 0;
}
总结
这次比赛暴露了我以下几个问题:
- 不够认真、仔细,对特殊情况考虑不全
- 代码中总存在一些小问题
- 太浮躁,认为第一遍测试过了就万事大吉了,没有检查代码的隐藏(bug)
- 太过依赖于样例和测试数据
以上是关于$Codeforces; Round; 504; (Div.2)$的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #504 E - Down or Right 交互题
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) A. Single Wildcard Patter
Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) D. Array Restoration(示例代码
E - Down or Right Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)