第六次寒假训练赛题解
第六次寒假训练赛题解
A CodeForces - 21A
简单模拟,模就完事了
#include<bits/stdc++.h>
using namespace std;
bool judge(int c)
{
return (c>=97&&c<=122)||(c>=65&&c<=90)||(c>=48&&c<=57)||c==95;
}
int main()
{
int t=0;
int c=getchar();
while(judge(c))
{
t++;
c=getchar();
}
if(t>=1&&t<=16&&c=='@')
{
L:
t=0;
c=getchar();
while(judge(c))
{
t++;
c=getchar();
}
if(t>=1&&t<=16)
{
if(c=='\n')
cout << "YES" << endl;
else if(c=='.')
goto L;
else if(c=='/')
{
t=0;
c=getchar();
while(judge(c))
{
t++;
c=getchar();
}
if(t>=1&&t<=16&&c=='\n')
cout << "YES" << endl;
else cout << "NO" << endl;
}else cout << "NO" << endl;
}else cout << "NO" << endl;
} else cout << "NO" << endl;
return 0;
} B CodeForces - 49B
简单模拟,模就完事了
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
cin >> a >> b;
int t=a,d=2;
while(t)
{
d=max(d,t%10+1);
t/=10;
}
t=b;
while(t)
{
d=max(d,t%10+1);
t/=10;
}
t=0;
int k=1;
while(a||b)
{
t+=(a%10)*k;
t+=(b%10)*k;
a/=10;
b/=10;
k*=d;
}
int ans=0;
while(t)
{
t/=d;
ans++;
}
cout << ans << endl;
return 0;
} C CodeForces - 128B
优先队列,后缀自动机也可,这里只写优先队列的方法
#include <bits/stdc++.h>
using namespace std;
struct str
{
string s;
int num;
bool operator <(const str &x)const
{
if(x.s==s)
return num>x.num;
return s>x.s;
}
} x;
int main()
{
priority_queue<str> q;
string s;
int n;
cin>>s;
cin>>n;
for(int i=0; i<s.size(); i++)
{
x.s=s[i];
x.num=i;
q.push(x);
}
while(!q.empty())
{
x=q.top();
q.pop();
n--;
if(!n)
break;
if(x.num<s.size()-1)
{
x.num++;
x.s+=s[x.num];
q.push(x);
}
}
if(n)
cout<<"No such line."<<endl;
else
cout<<x.s<<endl;
return 0;
} D CodeForces - 190C
简单递归一下就行
#include <bits/stdc++.h>
using namespace std;
string s,ans;
bool flag= true;
void input()
{
if (cin >> s)
{
ans+=s;
if (s=="pair")
{
ans+='<';
input();
ans+=',';
input();
ans+='>';
}
}
else
flag= false;
}
int main()
{
cin >> s;
input();
if (cin >> s)
flag= false;
if(flag)
cout << ans << endl;
else
cout << "Error occurred" << endl;
return 0;
} E CodeForces - 798B
暴力算最值
#include<bits/stdc++.h>
using namespace std;
int n;
string a[55],t;
int sum=1<<30;
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
{
int ans=0;
for(int j=0;j<n;j++)
{
if(i==j) continue;
t=a[j]+a[j];
if(t.find(a[i])==-1)
{
cout<<-1<<endl;
return 0;
}
ans+=t.find(a[i]);
}
sum=min(ans,sum);
}
cout << sum << endl;
return 0;
} F CodeForces - 1043C
字典序最小的时候s必然是前面全是a,后面全是b这个样子,以此为规则模拟一下会发现只要是s[i]!=s[i+1]就应该翻转
#include <bits/stdc++.h>
using namespace std;
string s,ans="";
int main()
{
cin >> s;
for(int i=0;i<s.size()-1;i++)
{
if(s[i]!=s[i+1])ans+="1 ";
else ans+="0 ";
}
if(s[s.size()-1]=='a')ans+="1";
else ans+="0";
cout << ans << endl;
return 0;
} 


查看5道真题和解析