
算法
Naruto_____
这个作者很懒,什么都没留下…
展开
-
hdu 3001(状态压缩dp)
#include #include #include #define Max1 10 #define Max2 59049 // 3^10 #define INF 0x3f3f3f3f using namespace std; /*由于每个点可经过两次 用三进制数表示状态 例10020(三进制)表示经过点2两次点1一次其余点都没经过*/ int n, m, ans; int Pow[M原创 2015-05-02 21:30:44 · 591 阅读 · 0 评论 -
hdu 1542(扫描线)
#include #include #include #include #define MAXN 110 using namespace std; struct Line { double y1, y2; double x; int flag; }; Line line[MAXN * 2]; struct Tree { double y1, y2; double x; in原创 2015-09-30 17:24:59 · 443 阅读 · 0 评论 -
排序背包(hdu 3466 & hdu 5501)
hdu 3466 #include #include #include #include using namespace std; int a[5010]; struct good { int p, q, v; }; good gd[510]; bool cmp(good a, good b) { return (a.p - a.q) > (b.p - b.q); } in原创 2015-10-11 19:27:11 · 543 阅读 · 0 评论 -
树的重心
树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重 心后,生成的多棵树尽可能平衡. poj 3107 #include #include #include #include #include #define Max 50010 using namespace std; int n; int Start[Max], N原创 2015-09-10 15:27:23 · 464 阅读 · 0 评论 -
快速排序
#include #define Max 100 int get_prvot(int a, int b) { return (a + b) / 2; } void q_sort(int left, int right, int *array) { if(left >= right) return ; int a = left; int b = right; int prvot原创 2015-09-09 20:47:44 · 352 阅读 · 0 评论 -
归并排序
#include #define Max 100 int min(int a, int b) { return a < b ? a : b; } void merge_array(int *array, int *new_array, int first, int last) { int mid = (first + last) / 2; int a = first; int b =原创 2015-09-09 20:49:23 · 455 阅读 · 0 评论 -
nyoj 289(0-1背包)
苹果 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。 输入有多组测试数据,每组测试数据第一行为2个正整数,分别代表苹果的个数n和背包的容量v,n、v同时为0时结束测试,此时不输出。接下来的n行,每行2个原创 2014-11-08 14:20:23 · 595 阅读 · 1 评论 -
Manacher(回文字符串)
void manacher() { int id, mx = 0; //mx为已知回文字符串触及到最远的下标 id为mx对应的回文中心 for(int i = 1; i < newlen; i++) { if(mx >= i) p[i] = min(p[2 * id - i], mx - i + 1); for(; news原创 2015-08-02 15:16:15 · 473 阅读 · 0 评论 -
hdu 5358(尺取法)
#include #include #include #include #define Max 100010 using namespace std; typedef long long LL; LL sum[Max]; LL p[50]; int n, con; void Init() { for(LL i = 1; i <= 1e10; i *= 2) p[con++] =原创 2015-08-09 11:02:19 · 594 阅读 · 0 评论 -
半平面交
首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面。 然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为ax + by + c = 0,那么两个半平面则可以表示为ax + by + c >= 0 和ax + by + c 还有,半平面的交是神马玩意? 其实就是一个方程组,让你画出满足若干个式子的转载 2015-05-07 10:22:58 · 906 阅读 · 0 评论 -
poj 2411(状态压缩dp)
#include #include #include using namespace std; int state[150]; long long dp[12][1 << 11]; int num[12]; int n, m; int p; bool Check(int x) { int i; bool flag = 1; for(i = 0; i < m; i++) if(x原创 2015-05-05 20:24:44 · 513 阅读 · 0 评论 -
poj 3254(状态压缩dp)
#include #include #include #define MOD 100000000 using namespace std; int n, m; int p; int state[1 << 12], pow[15]; int Map[15]; int dp[15][1 << 12]; void Init() { int i; p = 0; pow[0] = 1; f原创 2015-05-03 20:31:32 · 493 阅读 · 0 评论 -
hoj 2662(状态压缩dp)
#include #include #include #define Max 1<<9 using namespace std; typedef long long LL; LL n, m, k; LL p; LL status[Max], num[Max]; LL dp[81][21][Max]; bool Check(LL x) { if(x & (x << 1)) retu原创 2015-05-02 14:07:57 · 1507 阅读 · 0 评论 -
tyvj 1684(状态压缩dp)
#include #include #include using namespace std; int n, m, p; int Map[110]; int dp[110][65][65]; int s[110], num[110]; inline int max(int a, int b) { return a > b ? a : b; } bool check(int x) {原创 2015-05-02 14:13:21 · 488 阅读 · 0 评论 -
多重背包
poj 1742 #include #include #include using namespace std; const int MAXN = 100010; int n, m; bool dp[MAXN]; int a[MAXN], c[MAXN]; int queue[MAXN]; int main() { while(~scanf("%d%d", &n, &m)) {原创 2015-12-22 14:44:23 · 374 阅读 · 0 评论