题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5573

这个题……规律暂时还找不到,先贡献两发TLE的代码吧,一个dfs一个状压枚举。

 #include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath> using namespace std; typedef long long ll;
const int maxn = ; ll n, k;
ll path[maxn][];
int pcnt;
//1 + 0 -
bool exflag;
void dfs(ll cur, ll lv, ll id) {
if(exflag) return;
if(cur == n && lv == k) {
for(ll i = ; i < pcnt; i++) {
printf("%I64d %c\n", path[i][], path[i][] == ? '+' : '-');
}
exflag = ;
return;
}
if(cur != n && lv == k) return; path[pcnt][] = id;
path[pcnt++][] = ;
dfs(cur+id ,lv+, id*);
pcnt--; path[pcnt][] = id;
path[pcnt++][] = ;
dfs(cur+id ,lv+, id*+);
pcnt--; path[pcnt][] = id;
path[pcnt++][] = ;
dfs(cur-id ,lv+, id*);
pcnt--; path[pcnt][] = id;
path[pcnt++][] = ;
dfs(cur-id ,lv+, id*+);
pcnt--;
} int main() {
// freopen("in", "r", stdin);
int T, _ = ;
scanf("%d", &T);
while(T--) {
scanf("%I64d %I64d", &n, &k);
pcnt = ; exflag = ;
printf("Case #%d:\n", _++);
dfs(, , );
}
return ;
}

DFS

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath> using namespace std; typedef long long ll;
const int maxn = ;
ll n, k;
ll f[maxn];
ll ans[maxn];
bool sub[maxn]; void init() {
f[] = ;
for(int i = ; i < maxn; i++) {
f[i] = f[i-] * ;
}
} int main() {
// freopen("in", "r", stdin);
int T, _ = ;
init();
scanf("%d", &T);
while(T--) {
scanf("%I64d %I64d", &n, &k);
for(int i = ; i <= k; i++)
ans[i] = f[i-];
if(n % == ) ans[k]++;
ll nn = << k;
bool exflag = ;
for(ll i = ; i < nn; i++) {
if(exflag) break;
ll cur = ;
memset(sub, , sizeof(sub));
for(ll j = ; j <= k; j++) {
if(( << j) & i) {
sub[j] = ;
cur -= ans[j];
}
else cur += ans[j];
}
if(cur == n) exflag = ;
}
printf("Case #%d:\n", _++);
for(ll i = ; i <= k; i++) {
printf("%I64d ", ans[i]);
if(sub[i]) printf("-\n");
else printf("+\n");
}
}
return ;
}

ENUM

这个题想了很多天,想明白了其实还蛮简单的。

题目给了一棵满二叉树,按照层次遍历从左到右挨个编号1 2 3....问蛤蛤从根节点向下走,走到一个点可以加上当前节点编号也可以删掉当前节点编号。问走k层能否恰好续够n。

题目中给了一个条件:N≤2^K≤2^60

因为读题坑掉了没看到这个条件,浪费了很多时间在例如n=10 k=3的情况上。这种情况在我的搜索中是完全有结果的,但是实际上这个情况不会在题目中出现,因为8<10。

这样就好办了,我们考虑任何一个十进制数都可以表示为二进制,这个二进制表示了某一位上是否要加上对应的2的幂次。

(以上皆为口胡+脑补,正常题解在下面)

N<=2^k意味着我们总能找到第k+1个节点,使得N小于k+1节点的数值。既然如此,我们贪心地选取最左边的一条链。这样,最左边那个点必然是整层最小的。对于本题目而言,总有2^(k+1)-1≥n。

由于最左侧的链均为2的幂次,我们以前的知识中一定有这样一条规律:2^(k)-1=∑i(1,k-1)2^i。表达不清楚,举个例子:32-1=1+2+4+8+16。

我们假设整条长度为k链都是加的,那它的总和就是2^(k+1)-1,我们现在知道要求的n,那我们不需要的那部分的值为2^(k+1)-1-n。

假设这个值为x,那x也总是能表达为一个二进制数,我们只需要在这个链子上找到可以表示x的二进制数的位置,把它们标记为'-'即可。

 #include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath> using namespace std; typedef long long ll;
const int maxn = ;
ll n, k;
ll f[maxn];
ll ans[maxn];
bool sub[maxn]; void init() {
f[] = ;
for(int i = ; i < maxn; i++) {
f[i] = f[i-] * ;
}
} int main() {
// freopen("in", "r", stdin);
int T, _ = ;
init();
scanf("%d", &T);
while(T--) {
scanf("%I64d %I64d", &n, &k);
memset(sub, , sizeof(sub));
for(int i = ; i <= k; i++)
ans[i] = f[i-];
ll remain = f[k] - n - ;
if(n % == ) {
ans[k]++;
remain++;
}
remain >>= ;
int cnt = ;
while(remain) {
if(remain % == ) sub[cnt] = ;
remain >>= ;
cnt++;
}
printf("Case #%d:\n", _++);
for(int i = ; i <= k; i++) {
printf("%I64d ", ans[i]);
sub[i] ? printf("-\n") : printf("+\n");
}
}
return ;
}

[HDOJ5573]Binary Tree(找规律,贪心)的更多相关文章

  1. 找规律/贪心 Codeforces Round #310 (Div. 2) A. Case of the Zeros and Ones

    题目传送门 /* 找规律/贪心:ans = n - 01匹配的总数,水 */ #include <cstdio> #include <iostream> #include &l ...

  2. [LeetCode] 366. Find Leaves of Binary Tree 找二叉树的叶节点

    Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...

  3. [LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点

    Given a binary tree, find all leaves and then remove those leaves. Then repeat the previous steps un ...

  4. LeetCode Minimum Depth of Binary Tree 找最小深度(返回最小深度)

    题意:找到离根结点最近的叶子结点的那一层(设同一层上的结点与根结点的距离相等),返回它所在的层数. 方法有: 1.递归深度搜索 2.层次搜索 方法一:递归(无优化) /** * Definition ...

  5. Codeforces Round #265 (Div. 2) C 暴力+ 找规律+ 贪心

    C. No to Palindromes! time limit per test 1 second memory limit per test 256 megabytes input standar ...

  6. hdu - 6277,2018CCPC湖南全国邀请赛B题,找规律,贪心找最优.

    题意: 给出N个小时,分配这些小时去写若干份论文,若用1小时写一份论文,该论文会被引用A次,新写一篇论文的话,全面的论文会被新论文引用一次. 找最大的H,H是指存在H遍论文,而且这些论文各被引用大于H ...

  7. UVALive - 6577 Binary Tree 递推+找规律

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48421 Binary Tree Time Limit: 3000MS 问题描述 Binary Tree is ...

  8. Full Binary Tree(二叉树找规律)

    Description In computer science, a binary tree is a tree data structure in which each node has at mo ...

  9. [LeetCode] Find Mode in Binary Search Tree 找二分搜索数的众数

    Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred ...

随机推荐

  1. 【BZOJ】【1024】【SCOI2009】生日快乐

    枚举 想到以后一秒钟变水题…… 一开始我想:这不是可以随便切吗……但是突然想到:第一刀,必须切在n等分点上!因为要求最后每块的大小相等,那么同理,比如总共要切成7块,第一刀切成了$\frac{3}{7 ...

  2. 使用Ext.Net时,配置文件的最简单写法

    使用Ext.Net时,配置文件的最简单写法 <?xml version="1.0" encoding="utf-8"?> <!-- 有关如何配 ...

  3. 如何理解JS项目

    JS API(DOM/PhoneGap/Cordova/NodeJS/Library/Android/MongoDB....)最基础,可以看懂一行代码. -------> JS OOP, JS语 ...

  4. org.apache.kafka.common.network.Selector

    org.apache.kafka.common.client.Selector实现了Selectable接口,用于提供符合Kafka网络通讯特点的异步的.非阻塞的.面向多个连接的网络I/O. 这些网络 ...

  5. javascript设计模式--状态模式(State)

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 表单很多数据项录入的时候,提交controller发生异常,数据回显。

    1.添加的情况(Model传递Form Data) request.getSession().setAttribute("car", car); //抛出异常的时候,数据回显. 2 ...

  7. zoj Fibonacci Numbers ( java , 简单 ,大数)

    题目 //f(1) = 1, f(2) = 1, f(n > 2) = f(n - 1) + f(n - 2) import java.io.*; import java.util.*; imp ...

  8. SQL技术内幕-13 SQL优化方法论之分析实例级别的等待

    优化方法论的第一步是在实例级别上找出什么类型的等待占用了大部分的等待时间,这可以通过查询动态管理图(DMV,dynamic management view)sys.dm_os_wait_stats 运 ...

  9. SOLID 原则

     世纪的前几年里,“ Uncle Bob”Robert Martin 引入了用OOP 开发软件的五条原 则,其目的是设计出更易于维护的高质量系统.无论是设计新应用程序,还是重构现有基 本代码,这些 S ...

  10. hdu 4023 Game 博弈论

    思路: 将15种分成5类: 1.1和2为一类: 2.3,4,5,6为一类: 3.7,8,9,10为一类: 4.11,12,13,14,15为一类: 5.15为一类. 比较各类的优先级,就会发现放置的顺 ...