63pts,后面有几个样例显示460msTLE
  • 板块P1120 小木棍
  • 楼主KouMoSir
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/9/11 21:33
  • 上次更新2023/11/2 21:16:11
查看原帖
63pts,后面有几个样例显示460msTLE
1019606
KouMoSir楼主2023/9/11 21:33

我想着是不是自己还有地方减枝出问题

不然应该不会有460ms超时吧

//小木棍,dfs搜索优化
// 优化点1:所有木棍长之和是选定木棍的长度的倍数,即sum%len==0
// 优化点2:在搜索过程中先使用能使用的最长的木棍,并且只选定当前长度的木棍一次(即去重)
// 优化点3:在搜索过程中,若恰好用到一根新的木棍(即刚好切完当前木棍),第一次搜索得不到结果回溯后直接退出
// 优化点4:在搜索过程中,若当前剩余木棍的长度之和不足以拼接成目标木棍的当前长度,直接返回
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int li[70], times[55], ind, sum, m, n;
void dfs(int llen, int len, int nums,int le) {
	if (le < llen)return;//4
	if (nums == 0) {
		if (llen == 0) {
			cout << len;
			exit(0);
		}
		else return;
	}
	if (llen == 0)llen = len;
	for (int i = ind; i > 0; i--) {
		if (li[i] > llen || !times[li[i]])continue;
		times[li[i]]--;
		dfs(llen - li[i], len, nums - 1, le - li[i]);
		times[li[i]]++;
		if (llen == len || li[i] == llen)return;//3
	}
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> li[i];
		sum += li[i];
		times[li[i]]++;//2
		m = max(li[i], m);
	}
	sort(li + 1, li + 1 + n);//2
	ind = unique(li + 1, li + 1 + n) - li;//2
	for (int i = m; i <= sum; i++) {
		if (sum % i == 0) {//1
			dfs(i, i, n, sum);
		}
	}
}

我个人自己还能想到的几个优化地方

输入函输出换成scanf,print

使用二分法查找最大的可使用木棍

主函数中排序写成桶排序或者计数排序

不用unique去重,自己写数组记录去重

但是我觉得这些可能优化不了多少时间

其他的实在是没思路了,求大佬看看,我的提交显示460ms是不是还差很多啊

2023/9/11 21:33
加载中...