求人帮忙下载数据
  • 板块学术版
  • 楼主CommonDigger
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/9/7 22:00
  • 上次更新2024/9/8 10:21:33
查看原帖
求人帮忙下载数据
551417
CommonDigger楼主2024/9/7 22:00

如题,我机会用完了,麻烦还有机会的提供一下 #21 的数据

传送门

提交这个代码

/*
Luogu P1120 小木棍
https://www.luogu.com.cn/problem/P1120
*/
#include "iostream"
#include "algorithm"
using namespace std;
int a[70], nxt[70], n, m, high, temp, c;
bool vis[70];
void dfs(int x, int target, int pre, int cnt){
    int i;
    if(x==target){
        cnt++;
        if(cnt==m-1){
            cout << target;
            exit(0);
        }
        else{
            for(i=1;i<=cnt;i++) if(!vis[i]) break;
            vis[i]=1;
            dfs(a[i], target, i, cnt);
            vis[i]=0;
        }
    }
    int l=pre+1, r=c, mid, y=target-x;
    while(l<r){
        mid=(l+r)>>1;
        if(a[mid]<=y) r=mid;
        else l=mid+1;
    }
    for(i=l;i<=c;i++){
        if(vis[i]) continue;
        vis[i]=true;
        if(x+a[i]<=target) dfs(x+a[i], target, i, cnt);
        vis[i]=false;
        if(y==a[i] || y==target) return;
        i=nxt[i];
        if(i==c) return;
    }
}
bool cmp(int i1, int i2){
    return i1>i2;
}
int main(){
    cin >> n;
    for(int i=1;i<=n;i++){
        cin >> temp;
        if(temp<=50) a[++c]=temp;
        high+=temp;
    }
    sort(a+1, a+1+c, cmp);
    nxt[c]=c;
    for(int i=c-1;i>=1;i--){
        if(a[i]==a[i+1]) nxt[i]=nxt[i+1];
        else nxt[i]=i;
    }
    for(int i=a[1];i<=high/2;i++){
        if(a[c]<=i && !(high%i)){
            m=high/i;
            vis[1]=true;
            dfs(a[1], i, 1, 0);
            vis[1]=false;
        }
    }
    cout << high;
}
2024/9/7 22:00
加载中...