A
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
const int a[40] = {0,1, 1, 1, 2, 1, 2, 1, 5, 2, 2, 1, 5, 1, 2, 1, 14, 1, 5, 1, 5, 2, 2, 1, 15, 2, 2, 5, 4, 1, 4, 1, 51};
signed main() {
int n;
cin>>n;
cout<<a[n];
}
B
注意特判 (1) 的情况
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
signed main() {
int n,m;
cin>>n>>m;
if(n==1 || m==1) cout<<1;
else cout<<(n*m+1)/2;
}
C
看到根号注意讨论符号
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
signed main() {
int a,b,c;
cin>>a>>b>>c;
if(c-a-b>=0) cout<<(4ll*a*b<(c-a-b)*(c-a-b)?"Yes":"No");
else cout<<"No";
}
D
转化为,求一个序列,如果这个位置是 p[i],那么 1~i-1 内一定出现过所有 1~p[i]-1 的数字
对下面 dfs(p,lim) 做一点注解:这个函数是在枚举这个序列,p 代表的是当前枚举到第几位,lim 代表 1~p-1 位出现过的最大数字 +1,也就是第 p 位可以取的最大值
那么如果第 p 位取了 lim,往后就可以取 1~lim+1了
如果第 p 位取的值比 lim 小,往后仍然只能取 1~lim
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n,a[N];
void dfs(int p,int lim) {
if(p==n+1) {
for(int i=1;i<=n;i++) cout<<(char)(a[i]+'a'-1);
cout<<endl;
}
else for(int i=1;i<=lim;i++) {
a[p]=i;
dfs(p+1,lim+(i==lim));
}
}
signed main() {
ios::sync_with_stdio(false);
cin>>n;
dfs(1,1);
}
E
对于最终结果,我们可以 (O(n^2)) 枚举串的相对位置,如果可以 (O(1)) 判断匹配就好了
于是我们先把每一种相对位置的匹配情况都预处理出来即可
(这个题都跪,我昨晚的 IQ 应该是负的吧)
#include <bits/stdc++.h>
using namespace std;
const int M = 2005;
const int N = 30005;
const int o = 15000;
bool ab[N],ac[N],bc[N];
bool match(char x,char y) {
return x=='?' || y=='?' || x==y;
}
string a,b,c;
int la,lb,lc;
signed main() {
ios::sync_with_stdio(false);
cin>>a>>b>>c;
la=a.length();
lb=b.length();
lc=c.length();
for(int i=0;i<la;i++) for(int j=0;j<lb;j++)
if(!match(a[i],b[j])) ab[i-j+o]=1;
for(int i=0;i<la;i++) for(int j=0;j<lc;j++)
if(!match(a[i],c[j])) ac[i-j+o]=1;
for(int i=0;i<lb;i++) for(int j=0;j<lc;j++)
if(!match(b[i],c[j])) bc[i-j+o]=1;
int ans=N;
for(int i=-2*M;i<=2*M;i++) for(int j=-2*M;j<=2*M;j++) {
if(!ab[i+o] && !ac[j+o] && !bc[j-i+o]) {
ans=min(ans, max(la,max(lb+i,lc+j))-min(0,min(i,j)));
}
}
cout<<ans<<endl;
}
F
待填坑