算法
Naruto_____
这个作者很懒,什么都没留下…
展开
-
hdu 3001(状态压缩dp)
#include #include #include #define Max1 10 #define Max2 59049 // 3^10#define INF 0x3f3f3f3fusing namespace std;/*由于每个点可经过两次 用三进制数表示状态 例10020(三进制)表示经过点2两次点1一次其余点都没经过*/int n, m, ans;int Pow[M原创 2015-05-02 21:30:44 · 522 阅读 · 0 评论 -
hdu 1542(扫描线)
#include #include #include #include #define MAXN 110using 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 · 384 阅读 · 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 · 487 阅读 · 0 评论 -
树的重心
树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡.poj 3107#include #include #include #include #include #define Max 50010using namespace std;int n;int Start[Max], N原创 2015-09-10 15:27:23 · 417 阅读 · 0 评论 -
快速排序
#include #define Max 100int 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 · 320 阅读 · 0 评论 -
归并排序
#include #define Max 100int 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 · 388 阅读 · 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 · 529 阅读 · 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 · 421 阅读 · 0 评论 -
hdu 5358(尺取法)
#include #include #include #include #define Max 100010using 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 · 532 阅读 · 0 评论 -
半平面交
首先解决问题:什么是半平面? 顾名思义,半平面就是指平面的一半,我们知道,一条直线可以将平面分为两个部分,那么这两个部分就叫做两个半平面。然后,半平面怎么表示呢? 二维坐标系下,直线可以表示为ax + by + c = 0,那么两个半平面则可以表示为ax + by + c >= 0 和ax + by + c 还有,半平面的交是神马玩意? 其实就是一个方程组,让你画出满足若干个式子的转载 2015-05-07 10:22:58 · 845 阅读 · 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 · 470 阅读 · 0 评论 -
poj 3254(状态压缩dp)
#include #include #include #define MOD 100000000using 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 · 433 阅读 · 0 评论 -
hoj 2662(状态压缩dp)
#include #include #include #define Max 1<<9using 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 · 1462 阅读 · 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 · 455 阅读 · 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 · 346 阅读 · 0 评论