社区讨论

求 hack

P1120[CERC 1995] 小木棍参与者 5已保存回复 13

讨论操作

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

当前回复
13 条
当前快照
1 份
快照标识符
@lqz60l3a
此快照首次捕获于
2024/01/04 20:10
2 年前
此快照最后确认于
2024/01/04 23:12
2 年前
查看原帖
洛谷上是过的,但是,在我们校内网站一样的题过不了(因为数据不一样,但是我看不见),所以来问一下。。
评测结果 6060 TLE+WA。
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long

inline 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 ^ 48); ch = getchar(); }
	return x * f;
}

int n,sum=0,ans=0,len=0;
int a[1007];
int cnt[1007];
int lst[1007];
bool flag=0;

inline void dfs(int remain,int num,int minlen){
	if(flag) return;
	if(remain==0){
		dfs(len,num-1,a[n]);
		return;
	}
	if(num==0){
		cout<<len<<"\n";
		flag=1;
		return;
	}
	minlen=min(minlen,remain);
	while(minlen>0&&!cnt[minlen]) minlen--;
	while(minlen>0){
		if(cnt[minlen]>0){
			cnt[minlen]--;
			dfs(remain-minlen,num,minlen);
			cnt[minlen]++;
			if(remain==len||minlen==remain) return;
		}
		minlen=lst[minlen];
	}
}

signed main(){
    n=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
        sum+=a[i];
        cnt[a[i]]++;
    }
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++) if(a[i]!=a[i-1]) lst[a[i]]=a[i-1];
    for(len=1;len<=sum/2&&!flag;len++)
        if(sum%len==0) dfs(len,sum/len,a[n]);
    if(flag==0) cout<<sum<<"\n";
	return 0;
}

回复

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

正在加载回复...