社区讨论

求助今晚abc F

学术版参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhjtnfbi
此快照首次捕获于
2025/11/04 08:19
4 个月前
此快照最后确认于
2025/11/04 08:19
4 个月前
查看原帖
WA两个点,找不到了,求助各位大佬
CPP
#include<bits/stdc++.h>
#define int long long
#define ls(x) ((x)<<1)
#define rs(x) ((x)<<1|1)
#define mid ((l+r)>>1)
#define lowbit(x) ((x)&-(x))
#define pii pair<int,int> 
#define mk make_pair
using namespace std;
const int N=2e3+5,INF=1e9+7;
int n,m,T;
int f[N][2];
bool ok[N];
string s[N];
vector<int> g[N];
void init(){
    s[1]="1",s[11]="11",s[111]="111",s[1111]="1111";
    f[1][0]=f[1][1]=1;
    f[11][0]=f[11][1]=2;
    f[111][0]=f[111][1]=3;
    f[1111][0]=f[1111][1]=4;
    ok[1]=ok[11]=ok[111]=ok[1111]=1;
    for(int i=2;i<=2000;i++){
        for(int j=i*2;j<=2000;j+=i) g[j].push_back(i); 
    }
}
struct node{
    int x,y;
}to[N];
void dfs(int n){
    if(ok[n]) return;
    if(n>1) {
        dfs(n-1);
        if(1+f[n-1][0]+1<f[n][0]) {
            f[n][0]=1+f[n-1][0]+1;
            to[n]=node{n-1,1};
            f[n][1]=f[n][0]+2;
        }
    }
    if(n>11){
        dfs(n-11);
        if(2+f[n-11][0]+1<f[n][0]) {
            f[n][0]=2+f[n-11][0]+1;
            to[n]=node{n-11,11};
            f[n][1]=f[n][0]+2;
        }
    }
    if(n>111){
        dfs(n-111);
        if(3+f[n-111][0]+1<f[n][0]) {
            f[n][0]=3+f[n-111][0]+1;
            to[n]=node{n-111,111};
            f[n][1]=f[n][0]+2;
        }
    }
    if(n>1111){
        dfs(n-1111);
        if(4+f[n-1111][0]+1<f[n][0]) {
            f[n][0]=4+f[n-1111][0]+1;
            to[n]=node{n-1111,1111};
            f[n][1]=f[n][0]+2;
        }
    }
    for(int j:g[n]){

        dfs(j);dfs(n/j);
        if(f[j][1]+f[n/j][1]+1<=f[n][0]) {
            f[n][0]=f[j][1]+f[n/j][1]+1;
            to[n]=node{j,n/j};
            f[n][1]=f[n][0];
        }
        // cerr<<j<<' '<<n/j<<"\n";
    }
    // f[n][1]=f[n][0]+2;
    // if(n==12){
    //     cerr<<f[n][0]<<' '<<f[n][1]<<'\n';
    // }
    ok[n]=1;
}
void print(int n,bool ok){
    int x=to[n].x,y=to[n].y;
    if(n==1||n==11||n==111||n==1111){
        cout<<s[n];
        return;
    }
    if(ok) cout<<'(';
    if(n==x*y) {
        print(x,f[x][0]!=f[x][1]);
        cout<<"*";
        print(y,f[y][0]!=f[y][1]);
    }
    else {
        print(x,0);
        cout<<"+";
        print(y,0);
    }
    if(ok) cout<<')';
    return;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    for(int i=1;i<=2000;i++) f[i][0]=f[i][1]=INF;
    init();
    cin>>m;
    dfs(m);
    print(m,0);
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...