|
02 2012 档案
摘要:直线x=a,x=b又有n条线段求吧区域分成几个空间部分顶点-线段+空间=3把线段与两条直线相交的点ll,rr求出来按min(ll,rr)排序判断来降低时间复杂度View Code #include<stdio.h>#include<iostream>#include<algorithm>using namespace std;struct data{ double ll,rr; double duan; double min;}s[30099];double cmp(data a,data b){ return a.min<b.min;}int mai
阅读全文
摘要:http://poj.org/problem?id=3040注意到这么一句话where each denomination of coin evenly divides the next-larger denomination想到贪心,排个序,从高往下取同时加个最小公倍数的优化时间0msView Code #include<iostream>#include<algorithm>#include<string.h>using namespace std;int hash1[21];struct data{ int v,b;}s[29];int cmp(dat
阅读全文
摘要:特殊数排列组合联系好题如:9876543先算特殊数有6位数有几种在统计有7位时有几个View Code #include<stdio.h>#include<string.h>#include<iostream>#include<stack>using namespace std;bool hash[10];__int64 p(__int64 a,__int64 b){ if(a>b)return 0; __int64 all=1; while(a--) { all=all*b; b--; } return all;}__int64...
阅读全文
摘要:区间覆盖最小代价由于N<=10000排序后想到N*N的遍历不断更新add[i](表示到i最小代价)里的值,使之最小View Code #include<stdio.h>#include<iostream>#include<algorithm>using namespace std;const int maxint=999999999;struct data{ int ll,rr,c;}s[10009];int add[10009];int cmp(data a,data b){ if(a.ll==b.ll) return a.rr<b.rr; e
阅读全文
摘要:DIJK水过View Code #include<stdio.h>#include<string.h>#include<stack>#include<iostream>using namespace std;int n,m;int map[1009][1009];int path[1009];int dis[1009];bool used[1009];const int maxint=999999999;void dijk(){ memset(path,-1,sizeof(path)); memset(used,0,sizeof(used));
阅读全文
摘要:有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。不是圈的话,就像平分纸牌,加了个圈的话假设平均数是x,且a1给an了k个(k<0说明是an给a1了k个),那么总代价就可以算出来:令si=sum(a1..i)-ix,则总代价=sum|si-k|。易知k为中位数时此值最小。问题转化为求中位数……View Code #include<stdio.h>#include<iostream>#include<algorithm>#include<math.h>using namespace std;in
阅读全文
摘要:http://www.rqnoj.cn/Problem_62.html 有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。 现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。 例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6 移动3次可达到目的: 从 ③ 取 4 张牌放到 ④ (9 8 13 ...
阅读全文
摘要:给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。Sample Input7 45 7 2 4 3 1 6Sample Output4HINT第三个样例解释:{4}, {7,2,4}, {5,7,2,4,3}和{5,7,2,4,3,1,6}N<=100000思路:把小于中位数的数设为-1,大于的为1,等于的为0,ll=1表示该数位置在中位数的左边sum【i】数组记录1到i数的和统计sum[]中为0的数如sum :1(ll) 2(ll) -1(ll) 0 -1 -1 1 0有1个在统计sum位置左右相减为0的数又三
阅读全文
摘要:N个石子,A和B轮流取,A先。每个人每次最少取一个,最多不超过上一个人的个数的2倍。取到最后一个石子的人胜出,如果A要有必胜策略,第一次他至少要取多少个。找规律发现是一个Fibnaci数列,变下型就AC了View Code #include<stdio.h>long long a[1009];int main(){ long long n,i; while(scanf("%lld",&n)!=EOF) { a[0]=0;a[1]=1; if(n==1){ printf("1\n");continue; } ...
阅读全文
摘要:先排序42 102 113 203 21在用优先队列,按价值小的优先,day<=s[i].d入队,队列的容量要<=day,如>day,出队View Code #include<stdio.h>#include<algorithm>#include<iostream>#include<queue>using namespace std;struct data{ long long d; long long p;}s[100009];struct data1{ long long d; long long p; data1(data
阅读全文
摘要:给出背包的容量W、物品费用,每件物品只能取一次,求装满背包的方案总数以及最优方案总数(使物品总价值最大的方案,这里背包不需要装满)输入描述第一行有一个数k,代表有k组样例,每组样例有n+1行,第一行有两个数n,W,分别代表物品的件数,和背包容量,接下来为n行 每行有两个数,物品的费用c、物品的价值w输出描述每个样例输出一行,包含两个数:装满背包的方案总数以及最优方案总数,中间用空格隔开样例输入11 102 3样例输出0 1装满背包的方案总数简单最优方案总数if(f[j].p<f[j-s[i].c].p+s[i].w) 更新数据if(f[j].p==f[j-s[i].c].p+s[i].w
阅读全文
摘要:给你一个字符串,它是由某个字符串不断自我连接形成的。 但是这个字符串是不确定的,现在只想知道它的最短长度是多少Sample Input8cabcabcaSample Output3用到了kmp里的next自身匹配View Code #include<stdio.h>#include<math.h>char ss[1000009];int next[1000009];void getnext(char *s,int next[]){ int i,j; i=0;j=-1; next[0]=-1; while(s[i]) { if(j == -1||s[i...
阅读全文
摘要:首先找规律知道|s(47)-s(74)|<=1|s(47)-s(74)|==0 47474……4或 74747……7|s(47)-s(74)|==1会是4747……47或是7474……74最终由是s(4),s(7)决定View Code #include<stdio.h>#include<math.h>int main(){ int a,b,c,d; while(scanf("%d%d%d%d",&a,&b,&c,&d)!=EOF) { int i,j; if(abs(c-d)>1) { printf(&q
阅读全文
|