【POJ1011】Sticks
【题目概括】
现在有\(n\)个长度不超过\(50\)的木棍,请你把这些小木棍拼成若干根长度相同的木棍。
请你最小化拼成后的长度。
【思路要点】
- 考虑枚举最后的长度,然后判断是否可以,这样就不需要最优性剪枝了。
- 每一次\(dfs\)我们从大到小放置木棍,这样可以更快的逼近答案。
- 迭代的时候记录上次放置的长度和已经放置的木棍长度。
- 从小到大,找到答案就可以
exit掉了。
【代码】
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#define FI first
#define SE second
#define REP(i, s, t) for (int i = s; i <= t; i++)
#define PER(i, s, t) for (int i = s; i >= t; i--)
#define pb push_back
#define mp make_pair
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef long double ld;
template <class T> void chkmax(T& x, T y) { x = max(x, y); }
template <class T> void chkmin(T& x, T y) { x = min(x, y); }
namespace input {
template <class T>
void read(T& x) {
x = 0; char ch = 0; int f = 1;
for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = -1;
for (; isdigit(ch); ch = getchar()) x = x * 10 + ch - 48;
x *= f;
}
void re(int& x) { read(x); }
void re(ll& x) { read(x); }
void re(ull& x) { read(x); }
void re(char& x) { x = getchar(); }
void re(string& x) { cin >> x; }
}
using namespace input;
namespace output {
template <class T>
void write(T x) {
if (!x) { putchar('0'); return; }
if (x < 0) putchar('-'), x = -x;
static int top, stk[25]; top = 0;
while (x) stk[++top] = x % 10, x /= 10;
while (top) putchar(stk[top--] + 48);
}
void pr(int x) { write(x); }
void pr(ll x) { write(x); }
void pr(ull x) { write(x); }
void pr(char x) { putchar(x); }
void pr(string x) { cout << x; }
void pp() { putchar(' '); }
void ps() { puts(""); }
}
using namespace output;
const int N = 105;
int n, mx, mi, sum, need;
int a[N], buk[N];
bool flg = 0;
void dfs(int rest, int nowLen, int lastChose) {
if (!rest) {
pr(need), pr('\n');
flg = 1;
return;
}
if (nowLen == need) {
dfs(rest - 1, 0, mx);
return;
}
for (int i = lastChose; i >= mi; i--) {
if (flg)
return;
if (buk[i] && nowLen + i <= need) {
buk[i]--;
dfs(rest, nowLen + i, i);
buk[i]++;
if (!nowLen || nowLen + i == need)
break;
}
}
}
void solve() {
memset(buk, 0, sizeof buk);
sum = mx = 0; flg = 0; mi = inf;
for (int i = 1, x; i <= n; i++) {
re(x), sum += x, buk[x]++, chkmax(mx, x), chkmin(mi, x);
}
for (int i = mx; i <= sum / 2; i++)
if (sum % i == 0) {
need = i;
dfs(sum / i, 0, mx);
if (flg)
break;
}
if (!flg)
pr(sum), pr('\n');
}
int main() {
while (1) {
re(n);
if (!n)
return 0;
solve();
}
return 0;
}
【POJ1011】Sticks的更多相关文章
- 【poj1011】 Sticks
http://poj.org/problem?id=1011 (题目链接) 题意 给出一大堆小棍子的长度,需要把他们拼成几根长度相等的大棍子,求大棍子的最短长度. Solution 经典搜索题,剪枝剪 ...
- 【bfs】拯救少林神棍(poj1011)
Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...
- 【POJ 1011】 Sticks
[题目链接] http://poj.org/problem?id=1011 [算法] 深搜剪枝 首先我们枚举木棍的长度i,那么就有s/i根木棍,其中s为木棍长度的总和,朴素的做法就是对每种长度进行搜索 ...
- 【Uva 307】Sticks
[Link]: [Description] 给你最多n个棍子; (n< = 64) 每根棍子长度(1..50) 问你这n根棍子,可以是由多少根长度为x的棍子分割出来的; x要求最小 [Solut ...
- 【转】欧拉回路&特殊图下的哈密顿回路题集
转自:http://blog.csdn.net/shahdza/article/details/7779385 欧拉回路[HDU]1878 欧拉回路 判断3018 Ant Trip 一笔画问题1116 ...
- 【转载】图论 500题——主要为hdu/poj/zoj
转自——http://blog.csdn.net/qwe20060514/article/details/8112550 =============================以下是最小生成树+并 ...
- HDU 5914 Triangle 【构造】 (2016中国大学生程序设计竞赛(长春))
Triangle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- 【HDOJ图论题集】【转】
=============================以下是最小生成树+并查集====================================== [HDU] How Many Table ...
- 【LeetCode】深搜DFS(共85题)
[98]Validate Binary Search Tree [99]Recover Binary Search Tree [100]Same Tree [101]Symmetric Tree [1 ...
随机推荐
- SpreadJS 纯前端表格控件 V12.2 发布更新
用不到100行代码,在前端实现Excel的全部功能 千万前端开发者翘首企盼,SpreadJS V12.2 终发布更新:六大功能特性,带来更多便利,用不到100行代码,在前端实现Excel的全部功能! ...
- CF 148D Bag of mice 题解
题面 这是我做的第一道概率DP题: 做完后发现没有后效性的DP是真的水: 在这里说主要是再捋顺一下思路: 设f[i][j]表示有i只白鼠,j只黑鼠是获胜的概率: 显然:f[i][0]=1; 然后分四种 ...
- c++—简单的密码本实现
主要实现功能有增删改查数据,本地读取保存. 数据存储设计 data.h data.cpp #pragma once #define 添加账户 1 #define 删除账户 2 #define 修改账户 ...
- 关于时间日期的程序,主要datetime模块
以每年的立春作为起始点,每N天为一个单元,任给一个日期,返回该日期所在单元的起始和结束日期.例如:N=3, 输入日期20180208,返回 20180207,20180209(2018年的立春是201 ...
- PageObject 页面对象模式
一.PageObject 页面对象设计模式 (一个页面建一个类,即对象,页面对象) 每个页面都建对应的class,类中包含了页面的输入框.标题.元素等元素,测试代码中测试这个页面时,只需要调用这个页 ...
- Nginx启动错误 Failed to read PID from file /run/nginx.pid 的处理方法
问题产生原因 因为 nginx 启动需要一点点时间,而 systemd 在 nginx 完成启动前就去读取 pid file 造成读取 pid 失败 解决方法 让 systemd 在执行 ExecSt ...
- ajax异步刷新请求数据
AJAX是与服务器交换数据的艺术,它在不重载全部页面的情况下,实现了对部分网页的更新.AJAX = 异步 JavaScript 和 XML(Asynchronous JavaScript and XM ...
- SuperMap webgl对接iportal托管的三维服务
在webgl中对接iportal加密的三维服务时,需要提前注册key值.Cesium.Credential.CREDENTIAL = new Cesium.Credential("你的key ...
- 多线程编程-- part5.1 互斥锁之非公平锁-获取与释放
非公平锁之获取锁 非公平锁和公平锁在获取锁的方法上,流程是一样的:它们的区别主要表现在“尝试获取锁的机制不同”.简单点说,“公平锁”在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排序等待):而 ...
- MyCat配置简述以及mycat全局ID
Mycat可以直接下载解压,简单配置后可以使用,主要配置项如下: 1. log4j2.xml:配置MyCat日志,包括位置,格式,单个文件大小 2. rule.xml: 配置分片规则 3. schem ...