AtCoder Beginner Contest 468 C - Between P and Q 题解
前言
- msjing看了看 \(D\) 是什么啥比回文,\(E\) 像个啥比推式子,于是写完 \(C\) 直接摆
solve
暴力出奇迹
好吧其实这题就是爆搜- msjing都没往爆搜那想,以为是 \(DP\) 啥的
- 正式开始
- 我们发现 \(n \le 10\),这个范围 \(O(n^9)\) 都差不多能过
- 我们研究发现基本上许多解法都会少决策,所以回归本真,直接搜
- 枚举每个点可以放的值,如果可以就加入这个值,然后向下搜,到长度为 \(n\) 后判断,合法就统计答案
- 这个东西用字符串很方便,加值简单,还支持直接用 \(>\) 和 \(<\) 按字典序比较字符串
- 然后没啥了,看代码就很好理解
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
constexpr int maxn=21;
int read()
{
int x=0,f=1;
char ch=getchar();
while (ch<'0' || ch>'9')
{
if (ch == '-') f=-1;
ch=getchar();
}
while (ch>='0' && ch<='9')
{
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
return x*f;
}
int n;
string p,q;
int ans;
void dfs(int x,string s)
{
if (x == n)
{
if (s>p && s<q) ans++;
// cerr << "------------" << endl;
// cerr << s << endl;
// cerr << p << endl;
// cerr << q << endl;
// cerr << "------------" << endl;
return;
}
int v[maxn]={};
for (int i=1;i<=x;i++)
{
int x=s[i-1]-'0';
v[x]=1;
}
for (int i=1;i<=n;i++)
{
if (v[i]) continue;
string k=s;
k+=i+'0';
dfs(x+1,k);
}
}
signed main()
{
n=read();
for (int i=1;i<=n;i++)
{
int x=read();
p+=x+'0';
}
for (int i=1;i<=n;i++)
{
int x=read();
q+=x+'0';
}
dfs(0,"");
printf("%lld\n",ans);
return 0;
}
后话
- 这次 C 比之前几场都简单诶
msjing A 和 B 各吃一发罚时

浙公网安备 33010602011771号