PKUacm
寂寞灵魂
这个作者很懒,什么都没留下…
展开
-
poj3190
对牛按照milk的开始时间排序。 对优先队列里牛的milk的结束时间排序,结束时间最早的作为que.top()和牛i做对比,如果牛i的开始时间大于(因为文中说include A和B,所以不能取等号。)que.top()的结束时间,那么将该牛的牛栏(stall)设为与que.top()相同的牛栏,同时que.pop();否则新建一个牛栏,将牛i的牛栏设为该新建的牛栏。//1492k, 219ms#原创 2017-02-14 15:33:33 · 456 阅读 · 0 评论 -
poj 3061
二分搜索//956k, 79ms#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int MAX_N = 100005;int t, n, s;int arr[MAX_N], sum[MAX_N];void solve() { for(int i=0; i<n; i++)原创 2016-11-15 12:49:42 · 352 阅读 · 0 评论 -
poj 2236
简单的并查集。//188k, 1032ms#include <iostream>using namespace std;const int MAX_N = 1005;struct Point { int x; int y;};int n, d;int par[MAX_N], rank[MAX_N];Point p[MAX_N];bool status[MAX_N];void原创 2016-11-14 15:33:46 · 594 阅读 · 0 评论 -
poj 1703
并查集。 用一个opposite数组保存一个人a的对立人。对于输入的一个人b和c,只要判断b和opposite[c]是否是一组就好了。 也可以不用opposite数组,把并查集开到2倍的大小,用前n个保存数据,使用后n个作为opposite,一样的。#include <iostream>using namespace std;const int MAX_NUM = 10000005;int n,原创 2016-11-14 14:50:00 · 265 阅读 · 0 评论 -
poj 1127
//200k, 32ms#include <iostream>#include <cstdio>#include <cmath>using namespace std;const int MAX_M = 10005;const int MAX_N = 20;const double EPS = 1e-10;double add(double a, double b) { if(ab原创 2016-11-13 14:52:35 · 395 阅读 · 0 评论 -
poj 3279
尺选法、反转。//176k, 485ms#include <iostream>#include <cstring>using namespace std;const int MAX = 20;const int dx[5] = {-1, 0, 0, 0, 1};const int dy[5] = {0, -1, 0, 1, 0};int m, n;int tile[MAX][MAX];int原创 2016-11-16 13:48:54 · 404 阅读 · 0 评论 -
poj 3276
尺选法、反转。//212k, 344ms#include <iostream>#include <cstring>using namespace std;const int MAX_N = 5005;int n;int dir[MAX_N], f[MAX_N];int calc(int K) { memset(f, 0, sizeof(f)); int res = 0, sum原创 2016-11-16 13:21:35 · 452 阅读 · 0 评论 -
poj 1682
//168k, 0ms#include <iostream>#include <algorithm>#include <cmath>using namespace std;const int MAX_N = 105;int n;double arr[MAX_N];bool cmp(double a, double b) { return a < b;}int main() {原创 2016-11-11 16:20:50 · 378 阅读 · 0 评论 -
poj 1017
//转载请注明出处:優YoU //http://blog.csdn.net/lyy289065406/article/details/6674366 //Memory Time //248K 32MS #include<iostream>using namespace std;int max(int a,int b){ return a>b?a:b;}int main(voi转载 2016-11-11 15:56:48 · 347 阅读 · 0 评论 -
poj 2393
贪心策略是维持每周的最低单位成本,每周可能用上周剩下的,也可能生产新的。于是该周单位成本可能为上一周的单位成本加上储存费,也可能为该周的单位成本。#include <iostream>using namespace std;int n, s, c, y;int main() { scanf("%d%d", &n, &s); int minc = 5005; __int64 su原创 2016-11-11 14:41:46 · 532 阅读 · 0 评论 -
poj 3320
尺选法#include #include #include using namespace std;const int MAX_P = 1000005;int p;int a[MAX_P];void solve() { set all; for(int i=0; i<p; i++) all.insert(a[i]); int n = all.size();原创 2016-10-06 11:37:15 · 358 阅读 · 0 评论 -
poj 2739
没有删除掉freopen和fclose,WA,然后检查了一个小时,但是我是注释掉了它们的啊,不解。//188k, 0ms#include <iostream>using namespace std;const int MAX_N = 10016;int x;bool is_pri[MAX_N];int pri[MAX_N];void sieve() { int ids = 0;原创 2016-11-15 14:33:11 · 309 阅读 · 0 评论 -
poj3684
类比“火柴棒上的蚂蚁”。//184k, 0ms#include <iostream>#include <cmath>#include <algorithm>using namespace std;const double g = 10.0;const int MAX_N = 105;int N, H, R, T, C;double y[MAX_N];double calc(int T) {原创 2016-12-02 15:06:54 · 500 阅读 · 0 评论 -
poj 2785
折半枚举(双向搜索)//24716k, 6479ms#include <iostream>#include <algorithm>using namespace std;const int MAX_N = 4005;int n;int A[MAX_N], B[MAX_N], C[MAX_N], D[MAX_N];int CD[MAX_N * MAX_N];void solve() {原创 2016-12-02 15:19:31 · 267 阅读 · 0 评论 -
poj2155
//4108k, 485ms#include <cstdio>#include <cstring>using namespace std;int c[1010][1010] ;int lowbit(int x){ return x & -x ;}void add(int i,int j,int d){ int x , y ; for(x = i ; x > 0原创 2017-02-12 13:28:45 · 503 阅读 · 0 评论 -
poj3176、poj1163
poj3176//648k, 32ms#include <iostream>using namespace std;const int MAX_N = 355;int way[MAX_N][MAX_N];int n;int max(int a, int b) { return a>b ? a : b;}int main() { scanf("%d", &n); for(i原创 2017-02-17 13:18:07 · 338 阅读 · 0 评论 -
poj3685
是关于 i 的递增函数。#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define rep(i,s,t) for(int i=s;i<t;i++)typedef long long ll;int t,n;ll m;inline ll Cal(int i,int j){ re原创 2016-12-30 14:46:43 · 585 阅读 · 0 评论 -
poj3579
普通的n^2方法必定超时。 对a排序后,与a_i的差大于mid(也就是某个数大于a_i + mid)的那些数的个数如果小于N / 2的话,说明mid太大了。//272k, 594ms#include <iostream>#include <algorithm>using namespace std;const int MAX_N = 100005;int n, m;int a[MAX_N];原创 2016-12-30 14:35:58 · 494 阅读 · 0 评论 -
poj3104
大体思路: 题意:烘干机,给出一堆衣服的水分a[i],在不加烘干机情况下自动每一分钟减少1水分,每分钟可以变改衣服(i)到烘干机中,每分钟减少k水分,求最少需要多少时间。 题解:第一时间就想到使用二分枚据答案+验证这种思路,不过这题还是有些陷阱需要注意。 1. 验证答案时,如果 a[i] <= mid,让它自然烘干即可 ; 如果a[i] > mid,那么烘干这件衣服可以分成两段时间:使用烘干机原创 2016-12-27 15:10:57 · 507 阅读 · 1 评论 -
poj3273
//556k, 63ms#include <iostream>#include <algorithm>#include <numeric>using namespace std;const int MAX_N = 100005;int n, m;int money[MAX_N];bool C(int d) { int expense = 0; int months = 1;原创 2016-12-27 14:21:50 · 241 阅读 · 0 评论 -
poj1995
//172k, 79ms#include <iostream>using namespace std;int mod_pow(int x, int n, int mod) { int res = 1; while(n > 0) { if(n & 1) res = res * x % mod; x = (x % mod) * (x % mod) % m原创 2016-12-26 14:38:20 · 971 阅读 · 0 评论 -
poj3641
问p是不是伪素数。伪素数条件:①p不是素数。② ap = a (mod p)。#include <iostream>using namespace std;typedef long long ll;bool testPrime(ll x) { for (ll i=2; i*i<=x; i++) if(x % i == 0) return false;原创 2016-12-26 14:06:44 · 587 阅读 · 0 评论 -
poj3268
解题思路:最短路径只需要从x到i的最短路径代表他们返回的最短路径,然后将所有边反过来,再从x到i的最短路径代表他们来参加聚会的最短路径,这样对应相加找出一个最大值就可以了,当然其实不需要将所有边反过来,只需要将map的行和列对换一下就可以了,数据比较大,所以floyd超时,用dijkstra比较好点/*Memory 4136KTime 63MS*/#include <iostream>原创 2016-12-24 15:06:35 · 280 阅读 · 0 评论 -
poj3669
题意:巨大流星雨即将袭来。每个流星会对击中的地方以及周围(上下左右四格)造成破坏。Bessie开始时位于(0, 0)位置,并希望逃到一处不会被袭击到的地方(在第一象限内)。已知每移动一格需要1个时间单位,被流星破坏后的地方不能再进入。给出M个流星在T时刻击中的地方(X, Y),问Bessie能否逃到安全的地方,若能输出最短时间,否则输出-1。分析:依旧是迷宫问题。不同的是,需要自己构建出迷宫。首先将原创 2016-12-24 13:47:19 · 607 阅读 · 0 评论 -
poj 2456
二分搜索#include #include using namespace std;const int MAXN = 100005;const int INF = 1000000005;int n, m;int l[MAXN];bool C(int d) { int last = 0; for(int i=1; i<m; i++) { int crt = last原创 2016-09-29 12:22:11 · 395 阅读 · 0 评论 -
poj 1064
二分查找#include #include using namespace std;const int MAXN = 10005;const int INF = 100005;int n, k;double l[MAXN];bool C(double x) { int num = 0; for(int i=0; i<n; i++) num += (int)(l[i原创 2016-09-29 12:12:10 · 497 阅读 · 0 评论 -
poj 2229
如果i为奇数,肯定有一个1,把f[i-1]的每一种情况加一个1就得到fi,所以f[i]=f[i-1]如果i为偶数,如果有1,至少有两个,则f[i-2]的每一种情况加两个1,就得到i,如果没有1,则把分解式中的每一项除2,则得到f[i/2]所以f[i]=f[i-2]+f[i/2]由于只要输出最后9个数位,别忘记模1000000000#include int main() {原创 2016-09-20 14:45:45 · 244 阅读 · 0 评论 -
poj2388
快排或者随机快排都超时。快排:#include #include int n;int d[10005];int partition(int a[], int p, int r) { double x = a[r]; int i = p - 1; int temp; for(int j=p; j<r; j++) if(a[j] <= x) { i++; t原创 2016-09-20 12:52:29 · 631 阅读 · 0 评论 -
poj 2586
大意是一个公司在12个月中,或固定盈余s,或固定亏损d.但记不得哪些月盈余,哪些月亏损,只能记得连续5个月的代数和总是亏损(问全年是否可能盈利?若可能,输出可能最大盈利金额,否则输出“Deficit". 根据经验,贪心选择往往都在极端处(临界点)选择。(其实这题不用贪心,单纯枚举也可以AC,因为不同情况实在太少呐。。。。不难证明,每连续5个月中,在保证这5个转载 2016-09-19 15:45:43 · 219 阅读 · 0 评论 -
poj 2109
一般思路:二分+高精度算法 但是本题还有一个更加巧妙的办法去处理:首先需要明确:double类型虽然能表示10^(-307) ~ 10^308, (远大于题意的1101这个范围),但只能精确前16位,因此必须慎用!那么为了避免double对输入的数在运算过程中进行精确,那么我们必须让double的运算第一步就得到一个int(即小数点尾数全为0),这个不难理解转载 2016-09-19 14:55:29 · 247 阅读 · 0 评论 -
poj 1328
大致题意:将一条海岸线看成X轴,X轴上面是大海,海上有若干岛屿,给出雷达的覆盖半径和岛屿的位置,要求在海岸线上建雷达,在雷达能够覆盖全部岛屿情况下,求雷达的最少使用量。 本题一看就用贪心做,怎么贪呢?先研究一下每个岛屿,设岛屿到海岸线的垂直距离为d,雷达的覆盖半径为k,若d>k,直接输出-1,若d则雷达的建造有一个活动区间[x1,x2](用平面几何可以求得出来)。因此,在可以覆盖的情转载 2016-09-18 22:01:07 · 278 阅读 · 0 评论 -
poj 1321
思路是:dfs有两个参数 checkerNum 和 raw。checkerNum是棋子数量,raw是行号 。先从第一行开始遍历,对第一行属于棋盘的每一列:开始下一行。这一行处理完了,从下一行重新开始dfs。#include int n, k, i, j, ans;char maze[10][10];int column[10];void dfs(int checkerNum原创 2016-09-14 15:45:23 · 295 阅读 · 0 评论 -
poj 2251
三维的dfs。#include #include using namespace std;struct q { int x; int y; int z;}q[30000];int length[30000]; int xx[]={1,-1,0,0,0,0}; int yy[]={0,0,0,0,-1,1}; int zz[]={0,0,-1,1,0,0};转载 2016-09-14 15:02:00 · 237 阅读 · 0 评论 -
poj3253
#include using namespace std;int n;int l[20001];int main() { while(~(scanf("%d", &n))) { for(int i=0; i<n; i++) cin >> l[i]; int len = n; long long ans = 0; while(len > 1) {原创 2016-07-09 15:48:06 · 370 阅读 · 0 评论 -
poj2431
#include #include #include using namespace std;struct st { int d; int f;} s[10005];bool cmp(st a, st b) { return a.d < b.d;}int n, l, p, i;int main() { while(~scanf("%d", &n)) {原创 2016-07-09 15:34:01 · 416 阅读 · 0 评论 -
poj 3069
#include #include int r, n;int points[1001];using namespace std;int main() { while(~(scanf("%d%d", &r, &n))) { if(r == -1 && n == -1) break; for(int i=0; i<n; i++) cin >> point原创 2016-06-20 16:42:11 · 415 阅读 · 0 评论 -
poj 2385
在某一时刻牛的状态为,它可能上一时刻它也在这棵树下,或者是从另外一棵树移过来的。这样,我们用 dp[i][j] 来表示在第 i 个时刻走了 j 步接到的最多苹果数。暂且不管当前这一时刻是否接到苹果, dp[i][j] = max(dp[i-1][j], dp[i-1][j-1]) ,这描述了我前面说的两种状态。再看当前这一秒是否接到苹果。因为初始在第一棵树下,因而如果 j原创 2016-09-20 15:15:53 · 324 阅读 · 0 评论 -
poj 3255
#include #include #include #include #include #include #include #include#define maxn 5010#define maxm 12500010#define INF 0x3fffffffusing namespace std;struct edge { int to,w; edg转载 2016-09-24 13:43:17 · 258 阅读 · 0 评论 -
poj 3259
把 field 想象成一个图。如果要输出YES,则此图存在负圈。使用Bellman-Ford算法,判断第 n 次是否仍然更新了。使用Floyd-Warshall算法,判断是否有点的值小于原来的值。Bellman-Ford算法:#include using namespace std; #define MAXM 2710 #define MAXV 505 #原创 2016-09-21 14:10:26 · 206 阅读 · 0 评论 -
poj1979
简单的dfs#include <iostream>#include <cstring>using namespace std;const int MAX_V = 25;int w, h, res;char maze[MAX_V][MAX_V];bool used[MAX_V][MAX_V];int dx[4] = {-1, 1, 0, 0};int dy[4] = {0, 0, -1, 1}原创 2016-10-25 15:47:48 · 290 阅读 · 0 评论