- 博客(77)
- 收藏
- 关注
原创 最大值最小化
//目标学会用猜数字(二分)的方法,换个角度来解决问题 #include#include#includeconst int maxn=100000;int A[maxn],n,m,max;void input(){ scanf("%d%d",&n,&m); max=0; for(int i=0;i<n;i++) { scanf("%d",&A[i]); max>
2012-04-22 14:17:40
2706
原创 非线性方程求根
/*假设本金为2000元,分2个月还,每个月还1100,月利率为x,则(2000(1+x)-c)(1+x)-c=0,令f(x)=(2000(1+x)-c)(1+x)-c,当f(x)>0时,说明月利率太高了;当f(x)=0时说明月利率正确;当f(x)<0时,月利率过低。结果要求输出三位小数。 */#include#include#includeconst int maxn=1000;
2012-04-22 13:32:05
1133
原创 循环赛日程表问题
问题描述:设有n位选手参加网球循环赛,n=2^k,循环赛共进行n-1天,每位选手要与其他n-1位选手比赛一场,且每位选手每天比赛一场,不能轮空,按一下要求为比赛安排日程,(1)每位选手必须与其他n-1格选手格赛一场;(2)每个选手每天只能赛一场;(3)循环赛一共进行n-1天;请按此要求将比赛日程表设计成有n行和n-1列的一个表。在表中的第i行和第j列处填入第i个选手在第j天所遇
2012-04-21 10:16:15
1290
原创 范围统计
//旨在明白求上界和下界的原理的情况下,熟悉STL算法中的lower_bound和upper_bound函数的用法 #include#includeusing namespace std;const int maxn=1000;int A[maxn];int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin);
2012-04-21 09:35:19
781
原创 rqnoj350 第k小的数
原题给出一个长度为N的序列A1,A2,A3,...,AN,其中每项都是小于10^5的自然数。现在有M个询问,每个询问都是Ai...Aj中第k小的数等于多少。数据范围:在60%的数据中,1≤N≤1000,1≤M≤1000在100%的数据中,1≤N≤10000,1≤M≤2000每次询问的范围都不一样,因此以下的O(n)算法也会在很多个询问的情况下超时:#in
2012-04-15 15:38:01
943
原创 快速排序中的算法艺术
先给出个人认为在众多由不同的划分过程导致的各种快排算法中最高效简洁的算法:void Qsort(int *A,int x,int y){ if(x>=y) return; int p=x,q=y,m=A[x]; do { while(A[p]<m) p++; while(A[q]>m) q--; if(p<=q) swap(&A[p++],&A[q--]); }
2012-04-14 22:21:54
713
原创 边归并排序,边统计逆序对数
对于一组数,若i且Ai>Aj,则就是一个“逆序对”•请写一个程序,在尽量短的时间内,统计出“逆序对”的数目。以下算法的时间复杂度为:O(nlogn)#include#include#includevoid inverse_pair(int *A,int x,int y,int *cnt,int *T){ if(y-x>1)//至少有两个元素才能找逆序对数,只
2012-04-11 18:02:37
1205
原创 排序新风格——归并排序
分治算法风格#include#include#includevoid merge_sort(int *A,int x,int y,int *T){ if(y-x>1)//只有一个元素排个毛 { int m=x+(y-x)/2;//划分成[x,m),[m,y),无论是有偶数个元素,还是有奇数个元素, merge_sort(A,x,m,T); //始终划分成第一个
2012-04-09 18:14:03
752
原创 瞬间求解最大连续和
已知一组整数数据 A1,A2,A3,A4,A5,A6.....AN ,并返回最大连续和。先给出最极品的算法:#include#include#include#includeconst int maxn=10000;int A[maxn],S[maxn];int main(){#ifndef ONLINE_JUDGE freopen("in.txt","r",std
2012-04-09 18:04:48
783
原创 uva 10123 - No Tipping
原题下面的代码跑得很快,让我一不小心进入了uva前二十的光荣榜。但是假若我不说我这代码是参考大牛的,我会相当羞愧。大牛另外,思路是这样的:先放中间;再把两侧的分一下类,按力矩大小排序左边试放一下,右边试放一下。某种情况下,这个木块一定要现在放。搜索+剪枝。剪枝巧妙地令程序跑起来脱离地面。 vis[k]=true; int &d
2012-03-18 15:35:00
1025
原创 uva 208 - Firetruck
原题并不是所有的顶点都可以到达火灾现场,要从火灾现场开始遍历,找出可以到达火灾现场的所有顶点。再在这些顶点进行搜索。另外,快排中,是取中点的元素,将数组分成两半,左边的都小于这个元素,右边的都大于这个元素。比较的时候是while(A[i]#include#include#includeconst int maxn=25;int n,end,A[maxn],top,tot
2012-03-17 12:52:28
667
原创 uva 301 - Transportation 一切都是那么暴力
原题 回溯后要把数据改回来。#include#include#includeint n,b,m,A[25][3],cap[8],max;int try1(int u){ int i; for(i=A[u][0];i<A[u][1];i++) { cap[i]+=A[u][2]; if(cap[i]>n) return 0; } return 1;}
2012-02-25 22:39:37
834
原创 uva 539 - The Settlers of Catan
原题人类失去搜索,世界将会怎样?难以想象……#include#include#includeconst int maxn=30;int G[maxn][maxn],vis[maxn][maxn],n,max;void search(int u,int s){ if(max<s) max=s; for(int v=0;v<n;v++) if(G[u][v] && !vis
2012-02-25 18:49:51
637
原创 uva 639 - Don't Get Rooked
原题这题比起八皇后问题更复杂。有两种状态转移方式:直接进入下一行搜索;在这一行选一个,仍在这一行搜索。#include#include#includestruct Pos{ int x,y;};Pos C[16];int n,max,mat[6][6],vis[6][6];int is_capture(int x,int y,int s){ int i,j,ok
2012-02-25 18:32:42
677
原创 uva 110 - Meta-Loopless Sorts
原题从n个数的当前排列,得到n+1个数的排列,可以这样。设有排列a,b(a插入c,可以得到三个排列a如果已经确定a那么比较b否则有b>c,此时比较ac,可以得到排列a否则有a>c,此时,c把第n+1个需要比较的数插入原来n个数的排列,有n+1种方法,也即把n个数隔开写,得到n+1个空位置,每一个位置的插入得到一个新的排列。#include#incl
2012-02-24 21:47:42
799
原创 10474 - Where is the Marble? 有技巧地快速查找
原题提供三个代码。效率由高到低。当我认为二分的效率已经够高时,我看到了他的文章,又把效率提高了。链接#include#include#includeconst int maxn=20000;int be[maxn],pos[maxn];int main(){#ifndef ONLINE_JUDGE freopen("10474.txt","r",stdin);#e
2012-02-22 18:13:56
685
原创 uva 196 - Spreadsheet
原题下面有非常高效的代码。这题给出的A……ZZZ共18278列是纸老虎,这只老虎很吓人,老是诱惑人走进超时的怪圈。实则开一个1001*1001的数组就足矣。两个方法,一个是用简单的topo排序一下。另外一个是,链表处理。如D1这个格子,D1=A1+B1+C1。那么在A1,B1,C1三个单元格的出度指向域中保存D1,便可从A1,B1,C1出发,搜索到D1,便把当前的单元格值加到D1的单元格值上,
2012-02-17 18:09:54
1551
1
原创 uva 729 - The Hamming Distance Problem 枚举排列
参考《算法竞赛入门经典》,用递归枚举时。枚举排列时,到cur==n,即够n个元素的时候,才终止递归。枚举子集,则枚举到0-n个元素都要进行操作。一:#include#include#includeconst int maxn=20;int P[]={0,1};int A[maxn];void print_permutation(int n,int h,int *A,i
2012-02-14 17:55:19
892
原创 埃及分数
参考《算法竞赛入门经典》p130的分析。迭代加深搜索。原题:在古埃及,人们使用单位分数和(形如1/a的,a是自然数)表示一切有理数,如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中不允许有相同的。对于一个分数a/b,表示方法有很多种,其中加数少的比加数多的好,如果加数个数相同,则最小的分数越大越好。例如:19/45=1/3+1/15+1/45=1/3+1/18+1/3
2012-02-12 18:18:38
1449
原创 uva 131 - The Psychic Poker Player
参考题解 原题 子集生成的问题。用增量构造法。需要先弄清楚规则。特殊的顺子有两种,TJQKA和A2345。#include#include#includeusing namespace std;const int maxn=15;char *sf="A23456789TJQK";char *su="CDHS";char str[9][20]={"straight-f
2012-02-11 21:59:10
902
原创 uva 10098 - Generating Fast
原题#include#include#includeusing namespace std;int main(){#ifndef ONLINE_JUDGE freopen("10098.txt","r",stdin);#endif int n; scanf("%d",&n); char s[15]; while(n--) { scanf("%s",s);
2012-02-09 18:32:49
676
原创 uva 146 - ID Codes
原题 如果出题人知道有Next_permutation这个函数,估计他就会放弃这个尽管有着这么丰富背景的题了。#include#include#includeusing namespace std;int main(){#ifndef ONLINE_JUDGE freopen("146.txt","r",stdin);#endif char s[60]; while
2012-02-09 18:24:01
712
原创 uva 11205 - The broken pedometer
原题用增量构造法来生成子集。如果可以从个数由少到多生成子集,而不是按照字典序的话,那么可以更快得到答案。鉴于这样的考虑,当得到最小的子集个数,那么当前所需的个数大于最小的个数,就不用考虑其是否满足题意。这样做更快。#include#include#includeconst int maxn=110;int B[maxn][20],min,A[20],n,p;int is_ok
2012-02-09 18:04:17
863
原创 uva 10167 - Birthday Cake
原题不用判断在左边还是右边,只用判断代入式子后,分三类:大于0,小于0,等于0即可。#include#include#includeconst int maxn=110;int X[maxn],Y[maxn];int main(){#ifndef ONLINE_JUDGE freopen("10167.txt","r",stdin);#endif
2012-02-09 17:17:07
636
原创 uva 10305 - Ordering Tasks
题目大意:任务排序。有些任务之间有先后顺序。拓扑排序。如果有多个连通分量,那么把每个连通分量遍历完,加入topo数组,最后输出即可。代码一:先判断是否可以拓扑排序。代码二:上来就拓扑排序。代码一:#include#include#includeconst int maxn=110;int topo[maxn],t,n,c[maxn];bool G[maxn][ma
2012-02-04 13:35:42
861
原创 uva 10054 - The Necklace
用并查集判断所有珠子是否在同一个连通分量。如果并查集不懂的话,请参考:http://blog.csdn.net/lzw_java/article/details/7232287珠子有范围,先用max,min记录其最大最小值,后来在dfs下才能限定范围,而不总是在1到50里搜索。这样做,总是好的。#include#include#include#define INF 1<<30c
2012-02-04 12:46:27
939
原创 uva 10596 - Morning Walk
其实题目里有些内容忽悠人。road intersection讲的就是路的名字,像城市一样作为一个点,是顶点。而路则是边。这是欧拉回路问题。对于r=0的样例,要输出Not possible.例如100 0,可用下列网站来得到标准输出:http://www.uvatoolkit.com/problemssolve.php#105#include#include#includeconst
2012-02-03 23:17:27
773
原创 uva 10129 - Play on Words
需要了解几个知识:并查集(见《算法竞赛入门经典》第11章。)把26个字母当做节点,每个单词表示一条边。用这样的方式建图,比较入度与出度的大小关系即可。见《算法竞赛入门经典》第六章欧拉回路相关知识。另外,如果读取的字符数组开的不够大,会引起runtime error错误。#include#include#includeconst int maxn=1010,maxm=30;char s
2012-02-03 19:09:17
1293
1
原创 uva 10004 - Bicoloring
这题还真太简单了……不过我的方法效率有点低。改天要去看看大牛怎么做。bfs:#include#include#includeconst int maxn=210;bool G[maxn][maxn],vis[maxn],color[maxn];int n;int q[maxn*maxn];bool bfs(){ int front=0,rear=0; q[r
2012-02-03 13:28:19
557
原创 uva 10047 - The Monocycle
如果最后要求最短的时间,那么每一秒所在的状态为一个状态,这一秒可以引发的下一个状态再进入队列,每次取出队列的队首元素进行操作即可。#include#include#includeconst int maxn=30,maxm=18000;//18000=maxn*maxn*5*4 struct Point{ int x,y,c,d;//c=color green=0,black=1
2012-02-03 12:36:26
734
原创 uva 10557 - XYZZY 关键词:正环,无敌bfs,单源最短路spfa算法
笔者用时:4h。方法一:当发现有个和为正值的环存在时,直接求看该点能否直接到达终点。如果可以,直接返回true,即winnable。否则,不用做任何的标记。因为不会再去探索它是否可以直接到达终点。这个方法效率很高。rank:7。在搜索的过程中看看有没有正环,没有正环则继续搜索,当发现所有路径都不能到达终点时,返回假值。方法二:要低效一点。rank:300左右。用的spfa。用最后一组给的样
2012-01-26 17:32:52
3312
2
原创 uva 532 - Dungeon Master
方法一:结构体中增加一个记录时间的项。方法二:增加一个数组int dist[maxn][maxn][maxn];记录距离。每一个单位的距离就为一个单位的时间。因此结果照样输入即可。方法都差不多,评测结果却显示方法二要更快,为什么更快呢?还是评测结果的误差?求教。一:#include#include#includeconst int maxn=40;struct Point
2012-01-23 16:14:30
633
原创 uva 439 - Knight Moves
方法一:不用预处理。方法二:预处理,查表。#include#include#includeconst int maxn=70;int dir[8][2]={{-1,-2},{-1,2},{-2,-1},{-2,1}, {1,-2},{1,2},{2,-1},{2,1}};struct Point { int x,y,n;//n steps};Point q[ma
2012-01-22 10:37:33
562
原创 uva 705 - Slash Maze
方法一(放大两倍):for(j=0;jif(s[j]=='\\') mat[2*i][2*j]=mat[2*i+1][2*j+1]=1;else mat[2*i+1][2*j]=mat[2*i][2*j+1]=1;把下图放大两倍。得到以下表格。@表示有斜线,空白处表示无斜线。染色部分表示路径。结合另外一位大牛的题解来看。另外,考虑这点可不可以往右下走
2012-01-21 12:50:10
722
原创 uva 11111 - Generalized Matrioshkas
两解决方案。注意把数组开大点,能装下10000个元素是保险的。(1)#include#includeconst int maxn=10000;char s[maxn*3];int A[maxn],stack[maxn],top,n;int is_ok(){ int i; top=0; for(i=0;i<n;i++) { if(A[i]<0) stac
2012-01-09 18:09:36
578
原创 uva 673 - Parentheses Balance
#include#includeconst int maxn=130;char A[maxn],s[maxn];int top;int main(){#ifndef ONLINE_JUDGE freopen("673.txt","r",stdin);#endif int n; scanf("%d\n",&n); while(n--) { top=0; fgets
2012-01-07 19:13:50
467
原创 uva 101 the blocks problem
uva老不让过……注意:move a onto bwhere a and b areblock numbers, puts block a onto block b afterreturning any blocks that are stacked on top of blocks a and b to their initial positions.
2012-01-07 14:01:20
794
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅