摘要: LA3971 Assemble你有b块钱,给出n个配件的个子的种类,性能和价格,每种类型的配件买一个,价格不超过b,因为有水桶效应,所以电脑的性能取决于性能最低的配件的性能,问你b块钱配的电脑性能最高有多少。按照白书的说法,最大值尽量小,最小值尽量大之类的问题一般都可以用二分答案的方法来结局,这道题就是一道典型的最小值最大问题,所以采用二分答案#include #include #include #include #include #include #include #include using namespace std;const int maxn = 1005;struct Compon 阅读全文
posted @ 2014-02-09 14:27 acm_roll 阅读(643) 评论(0) 推荐(1) 编辑
摘要: 汉诺塔问题的变形,给定初始局面和目标局面,问最少多少步可以把初始局面变成目标局面。找到初始位置和目标位置不同的最大盘子X,那么比这个盘子还大的盘子就可以无视掉了。因为他们既不会被移动也不需要被移动。我们设f(p[],x,final)为当前初始状态为p,要把比x小的盘子移动到柱子final的最少步数那么有f(p[],x,final)=f(p[],x-1,6-final-p[x])+2^(x-1)-1+1意思就是先把比x-1小的都移动到柱子6-final-p[x],然后把x-1移动到final,然后把比x-1小的盘子移动到final有了这个式子之后,我们要求的答案可以分解成,从开始局面开始,把比X 阅读全文
posted @ 2014-02-09 13:40 acm_roll 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 给定一个1….n的正整数序列,每次操作可以从序列寻找出一个或多个正整数,然后同时减去一个相同的正整数。通过画图可以发现只要把后一半都减去n/2就和前一半一样了,所以有递推式 f(n )=f(n/2) + 1#include using namespace std;int f(int n) { return n == 1 ? 1 : f(n >> 1) + 1;}int main() { int n; while(~scanf("%d",&n)) { printf("%d\n",f(n)); } return 0;} 阅读全文
posted @ 2014-02-09 13:12 acm_roll 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 给你一个n*n的矩阵,你的任务是把尽量少的0变成1,使得每个数字的上下左右元素之和是偶数。直接暴力肯定会超时,找到行与行之间的关系,可以发现只要枚举第一行的所有情况,后面行都可以算出来。#include #include #include using namespace std;const int maxn = 16;const int INF = 2100000000 / 2;int mat[maxn][maxn],ans,n;int getsum(int x,int y,int m[maxn][maxn]) { int ans = 0; if(x > 1) ans += m[x - 阅读全文
posted @ 2014-02-09 13:08 acm_roll 阅读(185) 评论(0) 推荐(0) 编辑