Panasonic Programming Contest 2020

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

待填坑

原文地址:https://www.cnblogs.com/mollnn/p/12495949.html