问
  • 板块P1120 小木棍
  • 楼主Optics
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/8/2 17:32
  • 上次更新2023/11/3 06:19:00
查看原帖
问
511229
Optics楼主2023/8/2 17:32

声明:学习了题解第一条!

问题:所以不用快读就会TLE最后四个点吗,有其它优化吗

sto给您磕一个orz

#include<bits/stdc++.h>
using namespace std;
const int N = 70;
int n,m,d,a[N],nxt[N],cnt,sum,len;
bool used[N],ok;
bool cmp(int a,int b){
	return a > b;
}
void dfs(int k,int lst,int rst){
	if(!rst){
		int i;
		if(k == m){
			ok = true;
			return;
		}
		for(i = 1; i <= cnt; i++)
			if(!used[i])
				break;
		used[i] = true;
		dfs(k+1,i,len - a[i]);
		used[i] = false;
		if(ok)
			return;
	}
	int lft = lst;
	int rgt = cnt;
	int mid,tmp;
	while(lft <= rgt){
		mid = (lft + rgt) >> 1;
		if(a[mid] <= rst)
			tmp = mid,
			rgt = mid-1;
		else
			lft = mid+1;
	}
	for(int i = tmp; i <= cnt; i++){
		if(!used[i]){
			used[i] = true;
			dfs(k,i,rst - a[i]);
			used[i] = false;
			if(ok)
				return;
			if(rst == a[i] || rst == len)
				return;
			i = nxt[i];
			if(i == cnt)
				return;
		}
	}
}
int main(){
	scanf("%d",&n);
	for(int i = 1; i <= n; i++){
		scanf("%d",&d);
		if(d > 50)
			continue;
		a[++cnt] = d;
		sum += d;
	}
	sort(a+1,a+cnt+1,cmp);
	nxt[cnt] = cnt;
	for(int i = cnt-1; i >= 1; i--){
		if(a[i] == a[i+1])
			nxt[i] = nxt[i+1];
		else
			nxt[i] = i;
	}
	for(len = a[1]; len <= sum >> 1; len++){
		if(sum % len != 0)
			continue;
		m = sum / len;
		ok = false;
		used[1] = true;
		dfs(1,1,len - a[1]);
		used[1] = false;
		if(ok){
			printf("%d\n",len);
			exit(0);
		} 
	}
	printf("%d\n",sum);
	return 0;
}

2023/8/2 17:32
加载中...