nyoj
ZoneFv
这个作者很懒,什么都没留下…
展开
-
欧拉公式 nyoj 418 Divided elliptic
简单多面体的顶点数V、面数F及棱数E间有关系 V+F-E=2 这个公式叫欧拉公式。公式描述了简单多面体顶点数、面数、棱数特有的规律。在本题中n表示在椭圆边界上有几个点v 所有线段的端点数加上交点数e椭圆弧加上这些线段被切成的段数f椭圆分成的块数加上椭圆外面的那个则椭圆被分成的块数为 e-v+1;#include int原创 2012-03-09 09:48:52 · 815 阅读 · 0 评论 -
nyoj 434 Jungle Roads
http://acm.nyist.net/JudgeOnline/problem.php?pid=434比简单的一道最小生成树模板题,关键点在于建图时,数据读写格式的处理,由于没处理好,re了无数次#include#include#define MAX 1<<28int map[40][40];int n;int prime(){ bool flag[40];原创 2012-07-29 10:43:20 · 735 阅读 · 0 评论 -
nyoj 115 城市平乱
http://acm.nyist.net/JudgeOnline/problem.php?pid=115dijstra算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。思路:以叛乱城市为起点,寻找最短的驻部队城市#include#include#define INT_MAX 1<<29int map[1005][1005];int m,n,s[105];原创 2012-07-25 18:35:15 · 2268 阅读 · 0 评论 -
nyoj 191 小珂的游戏 和 nyoj361 又遇约瑟夫环
题目很有意思,主要思想是模拟它的过程,然后把求出的结果打表保存起来,不然会超时的主要难点就在于找规律,我当时根据自己找到的规律写出来的,竟然8的结果不对,很郁闷不知道为什么??#includeint main(){ int n,m,rest,now; int sign[15]={0}; while(~scanf("%d",&n),n) { if(sign[n]==0)原创 2012-08-10 11:03:51 · 1597 阅读 · 0 评论 -
nyoj 35 表达式求值
http://acm.nyist.net/JudgeOnline/problem.php?pid=35《数据结构》的经典例题,中缀式求值1.先乘除,后加减 2.同级运算,从左到右 3.先括号内,后括号外优先级从大到小:左括号——>乘或除——>加或减——>右括号将操作数和运算符分别储存在两个栈思路:1.操作数栈置为空栈,表达式起始符“=”为运算符栈的栈底元素。2原创 2012-07-23 12:15:15 · 877 阅读 · 1 评论 -
nyoj 417 死神来了
http://acm.nyist.net/JudgeOnline/problem.php?pid=417思路:这题用到了鸽笼原理(有n+1件或n+1件以上的物品要放到n个抽屉中,那么至少有一个抽屉里有两个或两个以上物品。),在本题,我们m看作为m个鸽笼,,我们将1到N所有数的倍数分组,最大分组数为p=N / 2 + (N & 1),看作p只鸽子,问是否能把这p只鸽子放入到m个笼子里,保证每原创 2012-07-22 12:09:33 · 1102 阅读 · 3 评论 -
nyoj 356 Jumping Cows
题意:给你n个数,找一些数(可以不连续,但顺序不可乱),奇数位置的数+,偶数位置的数-。最后得出的最大结果是?从前往后搜,交替执行:(1)找一个比相邻两个数都大的数,+;(2)找一个比相邻两个数都小的数,-;#include#includeint a[150005];int main(){ int n,m,i,j,sum,flag; scanf("%d",&原创 2012-07-22 09:02:45 · 738 阅读 · 0 评论 -
nyoj 318 Special particles
做了这一题深有感触,发现"思想"对于一个ACMer来说是多么的重要。。。碰到这一题首先是感觉没有什么思路,然后开始苦苦的找规律,找了好久发现,如果两个点互为对角线顶点,就不能相互抵消值然后就开始写,越写就越恶心,于是就暴力+暴力,终于写完了,抱着求WA的决心,提交了一下,竟然AC了。#includeint main(){ int n,i,sum,count,j; struc原创 2012-07-21 17:31:05 · 840 阅读 · 0 评论 -
nyoj 10 sking
http://acm.nyist.net/JudgeOnline/problem.php?pid=10当开始思路错了,wa了好多次动态规划与搜索的结合,用二维数组保存当前搜到的点为递增序列最大值的最长递增序列的长度#include#includeint map[105][105];int visit[105][105];//保存当前最长递增序列的长度int f[4][2原创 2012-08-03 19:08:09 · 861 阅读 · 0 评论 -
nyoj 38 布线问题
http://acm.nyist.net/JudgeOnline/problem.php?pid=38第一道最小生成树,prime算法 #include#include#define MAX 1<<28int map[505][505];int e,v;int prime(){ bool flag[505]; int path[505],i,j,sum=原创 2012-07-28 16:33:29 · 968 阅读 · 0 评论 -
nyoj 467 中缀式变后缀式 nyoj 257 郁闷的C小加(一)
中缀式变后缀式思路:从左到右扫描表达式,若为操作数,直接输出,若为操作符,则样将当前操作符和操作符栈的栈顶操作符进行优先级比较。(1).若当前操作符优先级大于操作符栈的栈顶操作符,则将当前操作符压入操作符栈中;(2)若当前操作符优先级等于操作符栈的栈顶操作符,则将当前操作符栈的栈顶的操作符出栈;(3)若当前操作符优先级小于操作符栈的栈顶操作符,则将当前操作符栈的栈顶的操作符输出,拿原创 2012-07-23 16:17:17 · 1318 阅读 · 3 评论 -
nyoj 743 复杂度 (数论)
题目大意:求出for循环中 operation 执行的次数解题思路:这是我队友chl出的一道题目,刚开始认为是找规律问题,然后就开始考虑找规律,昨天晚上找到一个自认为非常完美的规律,结果今天早上来发现是错的,后来经他提醒终于知道了,这一题需要用到组合数学的知识。。首先m层,每层都有一个值 i、j、k….我们发现这m个值是不重复的,而且是递增序列,于是我们可以想到只需原创 2013-07-30 10:35:11 · 1067 阅读 · 0 评论 -
nyoj 61 传纸条 (动态规划)
题目大意:略解题思路:可以看做是从起点传两次纸条到终点,且两个经过的路线不能有交叉我们可以用dp[k][i][j]来表示第k步第一个纸条的状态为(i , k+2-i)和第二个纸条的状态(j , k+2-j);因为i+j=k+2(因为是从(1,1)开始的),所以我们可以只用纸条横坐标i表示它当前所在的状态;#include#include#includeusing原创 2013-07-29 16:23:39 · 1560 阅读 · 0 评论 -
nyoj 239 月老的难题 二分图最大匹配(匈牙利算法)
如果对匈牙利算法不太懂的——请猛击二分图最大匹配的第一题,主要是对增广路的理解,上面博客讲的很清楚,不再罗嗦,上代码——#include#include#includeusing namespace std;int n;vector g[505]; //记录边int mach[505],count;bool flag[505]; bool find(int x)原创 2012-08-07 11:05:12 · 1437 阅读 · 0 评论 -
nyoj 269 VF ( 动态规划)
http://acm.nyist.net/JudgeOnline/problem.php?pid=269英文题很难理解,题意:1~1000000000之间,各位数字之和等于给定s的数的个数状态转移方程:d[i]][j]=d[i][j]+d[i-1][j-k] (0dp[i][j]保存的是前i位上数字之和是j的个数#includeint dp[10][82];void f原创 2012-08-09 17:14:33 · 1019 阅读 · 0 评论 -
nyoj 90 176 整数划分一 二 和 nyoj 279 队花的烦恼二
整数划分问题是算法中的一个经典命题之一,有关这个问题的讲述在讲解到递归时基本都将涉及。所谓整数划分,是指把一个正整数n写成如下形式: n=m1+m2+...+mi; (其中mi为正整数,并且1 如果{m1,m2,...,mi}中的最大值不超过m,即max(m1,m2,...,mi) 例如但n=4时,他有5个划分,{4},{3,1},{2原创 2012-03-26 15:42:46 · 1114 阅读 · 0 评论 -
最长公共子序列
参考 http://www.cnblogs.com/zhangchaoyang/articles/2012070.html经典的动态规划问题#include#includeint m[1002][1002];int main(){ int n,k,s,i,j; char a[1002],b[1002]; scanf("%d",&n); while(n--) {原创 2012-03-31 16:44:58 · 570 阅读 · 0 评论 -
nyoj 586 疯牛和nyoj 619 青蛙过桥 二分枚举+贪心
疯牛题意:简单的说就是给你一段长度,在这一段中给出m个点,然后在这m个点中选出k个点,让这k个点之间相邻两个点的之间距离的最小值最大思路:通过二分枚举这个最小值,然后通过贪心的思想找出满足要求的最大的这个最小值#include#include#define N 100005int a[N],n,m;bool greed(int k) //判断当前找到的这个最小值{ int原创 2012-12-04 12:04:20 · 1477 阅读 · 0 评论 -
nyoj 503 解方程 (牛顿迭代)
主要思想:首先,选择一个接近函数零点的,计算相应的和切线斜率(这里表示函数的导数)。然后我们计算穿过点并且斜率为的直线和轴的交点的坐标,也就是求如下方程的解:我们将新求得的点的坐标命名为,通常会比更接近方程的解。因此我们现在可以利用开始下一轮迭代。迭代公式可化简为如下所示:原创 2012-09-12 10:48:27 · 893 阅读 · 0 评论 -
nyoj 128 前缀式计算
http://acm.nyist.net/JudgeOnline/problem.php?pid=128递归思想。。。 #include#includeint i,len;char a[1000];double f(){ double sum=0; int n; switch(a[i]) { case '+':i++;return f() + f原创 2012-08-02 13:47:46 · 863 阅读 · 0 评论 -
NYOJ 27 水池数目 深搜或广搜
题目很简单是最基础的搜索题首先是深搜写法,递归 #include#includeint m[100][100],a,b;int f[4][2]={{-1,0},{0,1},{1,0},{0,-1}};void dfs(int k,int s){ int i; m[k][s]=0; for(i=0;i<4;i++) if(m[k+f[i][0]][s+f[i][1原创 2012-07-18 10:05:09 · 4154 阅读 · 0 评论 -
归并排序
逆序数 #include const int M = 1000001;int num[M], temp[M], n;double back;void merg(int left, int m, int right) { int i, j, p; i = left, j = m + 1, p = 0; while ( i <= m && j <= right ) { i原创 2012-03-16 16:45:17 · 477 阅读 · 0 评论 -
nyoj 88 汉诺塔一
一直比较纠结汉诺塔具体怎么移动的,今天终于鼓足勇气查了一下。。。。算法介绍:其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者(那是中国学者不屑于发现。。。)发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱原创 2012-03-31 16:56:50 · 3351 阅读 · 0 评论 -
nyoj 551 移动小球
第一次尝试用链表,以前从来不知道链表是什么玩意。。。通过一点点研究老秃驴的代码,才弄懂的,原来这就是传说中的链表。。我发现基础真的很重要,我真的有点好高骛远了,当我想学字典树的时候,我发现自己还不会链表,没办法只有好好去看看数据结构了,没看还好,一看我发现自己竟然不清楚什么是指针。。,于是狠下心来,终于把指针看了一遍。你说我容易吗???队友们几星期前已经把字典树搞定了,现在都在弄最短路,我原创 2012-03-29 20:11:17 · 948 阅读 · 0 评论 -
大数阶乘
今天看了一下别人做的大数阶乘,感觉这种思想很好。。#includeint main (){ int k,s,d,m,n,i,j; int a[10000]; while (scanf("%d",&n)!=EOF) { m=1;a[0]=1;s=0; for(i=2;i<=n;i++) { k=0; for(j=s;j<m;j++) { a[j]=原创 2012-03-11 21:34:14 · 497 阅读 · 0 评论 -
nyoj 461 Fibonacci数列(四)
Fibonacci数列是个神奇的数列,它包含了太多的知识,有些你甚至想都想不到……这个题目的意思很简单了,但是这个题目绝对不是让你循环算出的,或许你做过fibonacci数列(二)的话,你也许在想使用矩阵二分幂的方法,但是这个方法只适合找F(n)的低位数字,至于这个题目,则是另一种思路,使用通项公式。实际上我们可以把这一类题目归类:求最Fibonacci数列F(n)的高位,求n^m原创 2012-03-27 20:36:13 · 832 阅读 · 0 评论 -
nyoj 448 寻找最大数
每次在固定的的范围之内寻找最大数 #include#includeint main(){ int n,b,k,l,i,j; char a[100],c[100],max; scanf("%d",&n); while(n--) { max=0; memset(a,0,sizeof(a)); memset(c,0,sizeof(c)); scanf("%s %d"原创 2012-03-26 11:09:16 · 936 阅读 · 2 评论 -
nyoj 143第几是谁?和 nyoj 139 我排第几个
康拓展开和康拓逆展开 把一个整数X展开成如下形式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[2]*1!+a[1]*0! 其中,a为整数,并且0 {1,2,3,4,...,n}表示1,2,3,...,n的排列如 {1,2,3} 按从小到大排列一共6个。123 132 213 231 312 321 。原创 2012-03-26 09:40:46 · 1733 阅读 · 2 评论 -
nyoj 215 sum
题意:给定一个数n,在1+2+3+4+…+k中,求随意改变加减号能使其和(差)正好为n的k为多少。如果sum正好等于n则累加到这个k正好为答案;如果sum大于n时,则需要把前面的加号改为减号:如果改为-1,结果就减2,如果改为-2,结果就减4,以此类推,可以看出只要sum-n为偶数,则此时可以改sum结果为n,得答案。#includeint main(){ int n,k原创 2012-03-26 15:21:48 · 750 阅读 · 0 评论 -
nyoj 290 动物统计加强版 字典树
#include#include#includeint max=0;char ans[20];struct node//结点{ int count; struct node *next[26];//每个结点有26个分支};struct node *root;//根结点struct node *newset(){ struct node *p; p=(struct nod原创 2012-03-31 16:52:54 · 1012 阅读 · 0 评论 -
nyoj 470 Count the Length
http://acm.nyist.net/JudgeOnline/problem.php?pid=470题意是给定长和宽,求对角线红色区域的长度和。把m,n都除以他们的最大公约数t,使tm=m/t,tn=n/t,新tm,tn所组成的矩形的对角线长度*t就是原矩形的对角线长度。把对角线平均分成tm*tn条线段,对角线与每条线段的交点必在tm*tn份中的线段的端点上(可原创 2012-03-19 11:24:06 · 728 阅读 · 0 评论 -
NYOJ 308 Substring
http://acm.nyist.net/JudgeOnline/problem.php?pid=308我对这一题很是无语,一直拖到现在才做。。。题意大概就是找字符串s和它的逆序字符串的最长连续公共子序列#include#includeint main(){ int n,l,i,j,k; char a[55],b[55],c[55][55]; scanf("%d",&n);原创 2012-07-12 19:40:35 · 1085 阅读 · 0 评论 -
NYOJ 546 Divideing Jewels 多重背包
http://acm.nyist.net/JudgeOnline/problem.php?pid=546#include#include#includeusing namespace std;int dp[50010],v,j;void zeroonePack(int c,int w)//01背包{ for(j=v;j>=c;j--) dp[j]=max(dp[j],原创 2012-07-11 18:29:02 · 1280 阅读 · 0 评论 -
NYOJ 214 单调递增子序列(二)
http://acm.nyist.net/JudgeOnline/problem.php?pid=214这是一个很好的题目。题目的算法还是比较容易看出来的,就是求最长上升子序列的长度。不过这一题的数据规模最大可以达到40000,经典的O(n^2)的动态规划算法明显会超时。我们需要寻找更好的方法来解决是最长上升子序列问题。先回顾经典的O(n^2)的动态规划算法,设A[i]表示序列中的第i原创 2012-07-11 10:18:24 · 1244 阅读 · 0 评论 -
数根 nyoj 424 和 485
给出一个数n,求n^n的数根,数根即各位数字之和,如果这个和不是一位数,继续求这个数的各位数字之和,直到为一位数为止。现在分析一个问题,假设将十位数为a,个位数为b的一个整数表示为ab,则推导得ab*ab = (a*10+b)*(a*10+b) = 100*a*a+10*2*a*b+b*b根据上式可得:root(ab*ab) = a*a+2*a*b+b*b = (a+b)*(a+b原创 2012-03-22 16:29:37 · 761 阅读 · 0 评论 -
nyoj 410 how many ones?
最少多少个1组成的十进制1111……能整除给定的数。见 白皮书 181 #includeint main(){ int n; while(scanf("%d",&n)!=EOF) { int sum=0; int cnt=0; while(1) { ++cnt; sum=(sum*10+1)%n; if(sum==0) break;原创 2012-03-21 15:05:27 · 710 阅读 · 0 评论 -
nyoj 416 氢气球
数论问题 详情见 白皮书 184 #include#includeint a[10000];int main(){ int n,i,j,m; scanf("%d",&n); while(n--) { memset(a,0,sizeof(a)); for(i=0;i<10;i++) { scanf("%d",&m); for(j=2;m!=1;j++)原创 2012-03-21 14:55:22 · 579 阅读 · 0 评论 -
nyoj 451 光棍节快乐
全错排列问题,最早是由欧拉给出的答案.我们不妨设N个人的拿法为f(N),则f(N)=(N-1)[f(N-1)+f(N-2)].f(0)=0,f(1)=1.这个递推公式是很容易证明的.证明如下:设N个人为a,b,c,d...,N张卡为A,B,C,D...若a拿b的卡B,b也拿a的卡A,则显然只剩下N-2个人拿卡,自然是f(N-2)种了.若a拿b的卡B,b没拿a的卡A(与"b没拿b的卡B"相同原创 2012-03-21 14:50:12 · 1297 阅读 · 0 评论 -
nyoj 163 phonelist 字典树(2)
这是我做的字典树第二题,纠结了几天,终于做出来了,感觉真爽主题思想:把每个经过的结点进行标记,没走之前都把flag标记为0,走过的标记为1,一串电话号的末尾标记为2;举个例子 123和121.先插123;然后再插12,当插到最后2时,发现2已经被标记为1了,说明已经走过,即已经存在比他更长的有公共前缀短的电话号,此时说明电话薄不能建立,把判断能否建立的变量Flag置为1,;2.先插原创 2012-04-05 20:22:18 · 898 阅读 · 0 评论 -
nyoj 226 wall (凸包 Graham算法)
Graham 算法围墙的长途为凸包长+最近距离为半径的圆的周长 #include#include#include#define pi 3.1415926using namespace std;int n,L,top;struct point { int x,y;}p[1005],s[1005],t;double cross(point t1,p原创 2012-09-06 15:31:39 · 913 阅读 · 0 评论