ACM解题报告
AndyZhang
一些当前好走的路会越走越窄,而一些当前艰难的路却会越走越宽广。
展开
-
uva-10202-Pairsumonious Numbers
The analysis: This is not a so difficult problem. As we know, we know all the pairwise sums of N numbers, then the matter is to get the N numbers. Firstly, we let N[0..n] denots the N numbers,原创 2010-01-18 15:15:00 · 1494 阅读 · 0 评论 -
uva-10267 - Graphical Editor
I was so careless that I have got about 20 WAs for this problem.FFFFFFFFFFFFFF^. the ananlysis: this problem is very easy , and it just a simple simulation problem. And the most difficult原创 2010-01-18 16:14:00 · 1547 阅读 · 6 评论 -
uva-10196 - Check The Check
The analysis: This problem is so easy, but it is so difficult to AC that you should be more cautious.I have got many WAs.Because I made many mistakes.Although this problem waste much tim原创 2010-01-19 10:38:00 · 1037 阅读 · 0 评论 -
uva-10252-Common Permutation
题目大意: 给你两个字符串,求第一个字符串的某一个排列和第二个字符串的最长的公共子串。要求按字典顺序输出公共子串。算法分析: 由于是一个串的某个排列(任意顺序的),实际上就是求两个字符串相同的字符的个数,并且按照顺序输出即可。我的做法是将两个字符串映射到26个字符的数组中,数组中放的是字符出现的次数,然后比较两个字符串的映射数组,直接输出较少原创 2010-01-03 23:43:00 · 1456 阅读 · 0 评论 -
uva-850-Crypt Kicker II
The description of the problem: give you a sentence which has been decrypted, then give you many lines of cryptograph,and there may be one sentence mat原创 2010-01-04 21:06:00 · 1628 阅读 · 0 评论 -
uva-10188-Automated Judge Script
The description: The problem is a simulation of the judges.And, there only three status,as follows:AC,WA and PE.give you the answers and the key,please output the status.it is原创 2010-01-05 08:54:00 · 1253 阅读 · 0 评论 -
poj-1035-Spell checker
题目大意:检查拼写是否有错误。给你一个字典,然后给你要查询的单词,判断一个单词是否正确有以下规则:1.字典里面有这个单词2,删除一个字母,3增加一个字母4,替换任意一个字母。 算法:其实没什么算法,就是扫描一遍字典,比较目标字符串和字典字符串的长度,分三种情况:等长,少一个,多一个字母。代码:#include#includechar str[10010][20],s[20];i原创 2010-03-26 12:41:00 · 704 阅读 · 0 评论 -
poj1029
/*本题目题意是给你n个硬币,里面有一个是假的,然后你只有一个天平给你每次称的硬币以及结果判断哪个是假的。 算法:主要判断有两条,1,相等的肯定是真的,如果是《或者》,那么就让小的减1,大的加1, 如果绝对值最大的只有一个,那么假的就是那个。否则就是0.2,一种特殊情况,就是都是等号,那么剩下的都是假的 如果只剩一个,那么就是那个,否者0. WA了好久啊!*/#include#in原创 2010-03-30 13:46:00 · 1371 阅读 · 0 评论 -
poj2047
本题目实际就是求一个数的欧拉函数。这题目我用了素数表,欧拉函数。解释一下欧拉函数,欧拉函数就是求一个数,例如n,那么小于n的所有和n互质的数的个数。欧拉函数是,我们都知道,n可以分解成质数的不同幂次 的乘积,n=p1^a1*p2^a2*p3^a3……那么欧拉函数就是n*(1-1/p1)*(1-1/p2)*(1-1/p3)…… #includeusing namespac原创 2010-04-02 14:52:00 · 950 阅读 · 0 评论 -
poj1703
本题主要算法并查集,一般解决集合合并,是否在同一集合,一个集合中的元素个数等问题。复杂一点的就是带偏移量的,本题和1182很像,但是这个是只有两种情况。下面有个优化的算法。但是不是太多。//594MS/*#include#define N 100010using namespace std;int n,f[N],rank[N];int cal(int a){ int t=0; while(原创 2010-04-02 14:59:00 · 1321 阅读 · 0 评论 -
poj1887
本题目主要求最长上升子序列,dp,n^2的算法能过,数据有点弱。下面还有用二分优化的算法。/*//o(n^2)#include#define max(a,b) a>b?a:busing namespace std;int main(){ int i,j,k,l,m,mMax; int h[33000],f[33000]; k=1; while(k>0) { memset(f,0,size原创 2010-04-02 15:03:00 · 1288 阅读 · 0 评论 -
poj1062
本题主要用了dp和最短路解决这道题目,本题难点在等级差的问题,想明白就好做了。好像还可以dfs,没试过,估计时间会很长。//Dp/*#include#include//F[j]表示第j个物品最少的金币数int F[110],L[110],P[110],X[110][22000];int min(int a,int b)//比较大小{ return a>b?b:a;}int main(){ in原创 2010-04-02 15:06:00 · 1491 阅读 · 1 评论 -
poj2413
//本题不多说就是用Java解决高精度问题import java.io.*;import java.math.*;import java.util.*;public class Main { /** * @param args the command line arguments */ public static void main(String[] args)原创 2010-04-04 00:43:00 · 877 阅读 · 0 评论 -
poj1015
题目分析:首先我们用f[m,n]表示有m个候选人差值为n的最大的和。解释一下,已知辩护和反辩的值为d[i],j[i],那么差值就是d[i]-j[i],和就是d[i]+j[i].而这里的差值是选了要求的候选人的差值和和。 那么递推式是什么呢?不妨从f[m-1][t]->f[m][n],那么这两个之间的关系是什么呢,对于所有的t+d[i]-j[i]==k的最大的f[m-1][t]+d[i]原创 2010-04-04 16:59:00 · 3037 阅读 · 0 评论 -
poj1491
此题很水,鉴定完毕#include#includeusing namespace std;int judge(int x,int y){ if(x==1||y==1) return 1; int i; int p=x>y?y:x; for(i=2;i { if(x%i==0&&y%i==0) return 0; } return 1;}int n,a[55];int main(原创 2010-04-05 22:28:00 · 960 阅读 · 0 评论 -
poj3663
//本题有点赌博,先排序后比较,但是数据强的话也会超时。能过poj#include#include#includeusing namespace std;int cow[20010];int main(){ int N,L,cnt=0,i,j; scanf("%d%d",&N,&L); for(i=0;i scanf("%d",&cow[i]); sort(cow,cow+N);原创 2010-04-04 01:12:00 · 1437 阅读 · 0 评论 -
poj1141
这道题目是黑书上的原题,设dp[i,j]为从位置i到位置j需要加入字符的最小次数,有dp[i,j]=min(dp[i,k]+dp[k+1,j]),其中i //本题是自底向上的dp,还可以用记忆化搜索的方法#include#include#includeusing namespace std;const int V=110;char str[V];int dp[V][V],path[V][V原创 2010-04-04 14:28:00 · 2237 阅读 · 0 评论 -
poj3752
本题目就是打印一个图形。第一个算法是错的打出来的/*#includeusing namespace std;int m,n,k,p=1;int a[200][200];void dfs(int i,int j){ a[i][j]=++k; if(k==m*n) return; if(j dfs(i,j+1); if(i dfs(i+1,j); if(j>1&&a[i][j-1]==0原创 2010-04-04 21:35:00 · 722 阅读 · 0 评论 -
poj3752
本题目就是打印一个图形。第一个算法是错的打出来的/*#includeusing namespace std;int m,n,k,p=1;int a[200][200];void dfs(int i,int j){ a[i][j]=++k; if(k==m*n) return; if(j dfs(i,j+1); if(i dfs(i+1,j); if(j>1&&a[i][j-1]==0原创 2010-04-05 22:27:00 · 626 阅读 · 0 评论 -
poj2236
本题就是简单的并查集,没有什么东西,连rank数组都不要,一开始忘了写init函数了,也就是说没初始化,单步了一次然后就过了,以后init函数在主函数写了,每次都忘。想让程序写得有层次点就出问题,bs一下自己。#includeusing namespace std;int f[1010],a[1010][2],used[1010];int n,d;void init(){ for(in原创 2010-04-06 22:18:00 · 1267 阅读 · 0 评论 -
poj2229
递推:i为奇数的时候,a[i]=a[i-1],否则a[i]=a[i-2]+a[i/2];由于数比较大不要递归,否则会栈溢出-RE。#includeusing namespace std;int a[1000001];int main(){ int n,i; a[1]=1; a[2]=2; for(i=3;i { a[i]=a[i-2]+a[i/2]; if(a[i]>=10000000原创 2010-04-07 13:17:00 · 1329 阅读 · 0 评论 -
poj2362
本题写得太痛苦了,还是对深搜不太理解啊,太不熟了。其实还是递归不熟。注释的事错误代码。本题和1011差不多,其实就是从大到小排序,然后枚举每一根能否配成完美的一边,如果不可以,那就过去。剪枝:直接说深搜过程中的剪枝,当一根长度和前一根一样长,而前一根没有找到符合的,那么这根直接过。#include#include#includeusing namespace std;int n,len,p原创 2010-04-09 20:53:00 · 744 阅读 · 0 评论 -
poj3740
/*本题感觉设计很巧妙,虽然很水,但是对于dfs不熟的我感觉还是很难。通过这道题,让我又对dfs多了一份了解。首先本题是选出一些行是每一列只含有一个1.行最多也就16,枚举也就2^16,不算太大。还不到1000000,于是很适合用dfs。中间的used的数组很精妙,used数组就是最终的结果。通过判断used是不是全是1来判断结果。通过每一行和used比较来确定是否可以和used并,也就是说选这一原创 2010-04-10 16:38:00 · 1383 阅读 · 0 评论 -
poj1700
//用两个速度快的运两个速度慢的。//有两种方式。a//a,b-> a b//a,c-> a a->表示过河 #include#includeusing namespace std;int a[1200];int main(){ int cas,n,i,j,f1,f2; scanf("%d",&cas); while(cas--) { scanf("%d",&n);原创 2010-04-10 16:47:00 · 682 阅读 · 0 评论 -
poj 3742
这道题目折磨我啊,晚饭都没吃。其实很简单。下面试c++代码,但是因为不是高精度就WA了,于是我就改成java代码就AC了。巨无语,还RE一次,是因为数组要开到300,210都不行。 C++:#include#includeusing namespace std;long c[201][201];long a[202],b[202];void init(){ int i,j;原创 2010-04-10 19:34:00 · 651 阅读 · 0 评论 -
poj2182
本题题意很简单,就是给你一个N-1的序列,表示从第二个数开始,这个数前面有多少个比自己小的数。求这个序列。这题一开始我以为是组合数学的逆序列,不过其实也差不多。后来想了一个算法不过错了,那就不说了。这个算法是o(n^2)的算法如果数据强的话会超时。就是如果这个数前面有m个比自己小的,那么我就假设其为m+1,然后判断前面有没有出现过m+1,如果有,那么把所有大于等于m+1的数都加1.注意第一原创 2010-05-14 15:26:00 · 1480 阅读 · 0 评论 -
poj1742
本题就是一个多重背包的变形。给你钱的价值和数量,求能在cash价值以内能够拼出多少种钱数。下面注释掉的那一部分耗时1.7s+,没注释掉的本来想优化的却是3s,卡着点过得。本题其实就是背包的简单变形。并且注意,当多重背包转化为01背包的时候第二重循环一定要从大到小进行,否则会出错。o(N*M)的算法,所以我那个优化其实没有反而加大了,因为改成01背包会增加N的,也就是index肯定比n大原创 2010-05-15 11:17:00 · 2533 阅读 · 0 评论 -
poj1450
本题就是一个找规律的题目。只有当行列都是奇数的时候才会用走中间的交叉路,并且只需要走一次。#includeint main(){ int t,i,m,n,cnt=0; scanf("%d",&t); while(t--) { cnt++; scanf("%d%d",&m,&n); i=m*n; printf("Scenario #%d:/n",cnt); if(!(i%2))原创 2010-05-15 15:07:00 · 762 阅读 · 0 评论 -
poj3507
题目很长但很水,就是六个数去掉一个最大值最小值求平均值最易输出用%g可以去掉的0; #includeint main(){ int a[7]; int max=0,min=9999999; int i,sum; while(1) { max=0,min=9999999; sum=0; for(i=0;i { scanf("%d",&a[i]); sum+=a[i];原创 2010-05-15 15:40:00 · 1164 阅读 · 0 评论 -
poj2304
水题,不过要注意看图,转的是表盘不是表针,刚好相反,模拟题 #includeint main(){ int a,b,c,d; int sum; while(1) { scanf("%d%d%d%d",&a,&b,&c,&d); if(!(a|b|c|d)) break; sum=0; sum+=720; sum+=((a+40-b)%40)*9; sum+=36原创 2010-05-15 18:25:00 · 783 阅读 · 0 评论 -
poj3767
这道题目是上次在北大比赛的时候没做出来。貌似过得人挺多的,大多数人的算法是两次最短路+枚举我写的时候发现太麻烦了,后来看到有人说一次就可以了。这道题考你对最短路的理解。无向图加有向。 #include#include#include#define inf 100000000int N,M;int map[610][610];int city[610];int dis1[610]原创 2010-05-15 21:30:00 · 752 阅读 · 0 评论 -
poj3664
水题一道,主要练习一下sort #include#includeusing namespace std;struct cow{ int fv; int sv; int id; bool operator { if(fv>other.fv) return true; else return false; }}Cow[50010];//int cmp(const cow原创 2010-05-17 20:04:00 · 821 阅读 · 0 评论 -
poj1131
个人用java水的,下面转一个c++写的 package javaapplication4;import java.io.*;import java.math.*;import java.util.*;/** * * @author friendy */public class Poj { public static void main(String[] args) thr原创 2010-05-17 21:19:00 · 658 阅读 · 0 评论 -
poj1131
个人用java水的,下面转一个c++写的 package javaapplication4;import java.io.*;import java.math.*;import java.util.*;/** * * @author friendy */public class Poj { public static void main(String[] args) thr原创 2010-05-17 22:48:00 · 603 阅读 · 0 评论 -
poj1469
这道题想了一下是一一对应,刚好符合二分匹配,也是最基本的二分匹配但是有个地方写错了,搞成双递归了,bs啊 专业模板。#include#includeusing namespace std;int used[310],link[310],mat[310][310];int n,m;int path(int t){ int i; for(i=1;i { if(!used[i]&&mat[原创 2010-05-17 22:50:00 · 1329 阅读 · 0 评论 -
sudo
<br /><br />//自己写了一个数独,刚好和poj的2676<br />#include<stdio.h><br /> <br />char ch[10];<br />int sudo[9][9];<br />int judge(int p)<br />{<br />int i,j,x,y;<br />x=p/9;<br />y=p%9;<br /> <br />for(i=x/3*3;i<x/3*3+3;i++)<br />{<br />for(j=y/3*3;j<y/3*3+3;j++)<br原创 2010-07-17 00:13:00 · 387 阅读 · 0 评论 -
poj 3624
<br /><br />1A 感觉数据有点弱,这题很明显01背包,但是复杂度是o(nm)将近10^7而给了1s时间,但是还是写写试试,结果230+ms,数据有点弱,算法很简单就是01背包问题。<br /> <br />#include<stdio.h><br />#include<string.h><br />#include<stdlib.h><br /> <br />int f[12881],a[3402][2];<br />int n,m,ans;<br /> <br />void dp()<br /原创 2010-07-17 00:45:00 · 879 阅读 · 0 评论 -
poj1195
<br />这道题目看了网上的二维数组懂了,但是我自己写的把而未转化为一维为什么就不对呢?求高手指教啊<br /> <br /><br />#include<iostream><br />//#include<vector><br />using namespace std;<br /> <br />int V[1024*1024];<br />int S,A,B,L,R,T,X,Y;<br /> <br />int lowbit(int x)<br />{<br />return x&(x^(x-1));原创 2010-07-17 03:28:00 · 683 阅读 · 0 评论 -
poj2777
<br /><br />本题是典型的线段树的题目,由于颜色的数目较少,所以只使用一个整形变量来表示。<br /> <br />#include<iostream><br />using namespace std;<br /> <br />struct node//结构<br />{<br />int l,r;//左右子树<br />int col;//颜色<br />}a[1000000];<br />int L,T,O;<br />int cnt;<br /> <br />inline bool sin原创 2010-07-15 15:58:00 · 738 阅读 · 0 评论 -
poj 1459
这道题是典型的最大流的问题,而我也只会EK算法,其他的不太懂,但是EK算法用不好就会超时。开始用STL输入用cin,但是TLE,改成数组和合scanf以后还是超时,后来我发现,一个浪费时间的df,下面我已经注释。其实EK基本上可以满足你做网络流。#include#includeusing namespace std;#define MIN(a,b) a#define M 110int start,end;int n,np,nc,m;int net[M][M];int path[M*M];int add;vo原创 2010-07-16 17:51:00 · 621 阅读 · 0 评论