11 2012 档案
摘要:贪心基础题。至少能赢多少次。换句话说,就是自己每次出一张牌,其他人尽量让你输,其他人足够聪明,当你出一张牌时,为了让你输,会出一张比你大的,除非其他人没有,那么这轮你就赢啦,为了不造成浪费,最优的方法肯定是出一张比你出的牌大的牌中最小的牌(贪心的思想),可以证明这样的贪心结构是正确的#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1001;
int vis[maxn],a[maxn];
int n,m;
int mai
阅读全文
摘要:网络流最基础的题目,最大流#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=210;
const int inf=1<<30;
int cap[maxn][maxn],flow[maxn][maxn],d[maxn];
int n,m,tot;
void ek()
{ int q[maxn],p[maxn],i; int front,rear; for(;;) { memset(d,0,sizeof(d)); fr
阅读全文
摘要:这道题让我新认识到的是,做dp题,不一定非得找到具体的某一个最优子结构,可以美剧所有可能子结构的最优解,通过比较得到结果。向此题,只要找到和子结构之间的关系,然后选取最大的,之前一直死去想最有子结构,后来看了黑书。发现lrj所说,只是去找子问题中的最优解。还有就是数据中有空字符串,要注意#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=110;
const int inf=1<<30;
char s[maxn];
阅读全文
摘要://读了半大天题终于发现就是LIS问题
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn=100000;
const int inf=1<<30;
int s[maxn],r[maxn],d[maxn],g[maxn];
int n;
int low_bound(int x)
{ int high=n,low=0,mid; while(high-low>0) { mid=low+(high-low)/2; if(g[mid]>=x) high=mid
阅读全文
摘要:dp,LCS的应用//求出输入的字符串和他的回文串的LCS的长度l,用此字符串的长度n-l,即得结果
//还有存储的问题,如果用f[maxn][maxn]存储的话会超内存,可通过滚动数组优化
//因为求当前f[i][j]时可能会用到f[i-1][j-1],f[i-1][j],f[i][j-1],观察发现i,j
//只用到当前的i,i-1,二者可用奇偶性区分,只需用一个f[i%2][j]就可表示,为什么
//不能用f[i][j%2]表示,可通过判定求当前的f[i][j%2]时,f[i-1][j%2]并不是f[i-1][j]
//所以这样做是错误的,但前者却可以通过类似的方法判是正确的,所以只需f
阅读全文
摘要:dp ,经典LCS,你懂的,不解释//dp 经典的LCS问题。对于s1,s2,如果c(s1)=c(s2),则f(s1,s2)=f(s1-1,s2-1,)+1,如果c(s2)!=c(s1),则
//f(s1,s2)=max{f(s1-1,s2),f(s1,s2-1)},边界是f(s1,0)=0,f(0,s2)=0; #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1000;
const int inf=1<<31
阅读全文
摘要:1、USACO2006年November题目和测试数据的网址http://ace.delos.com/NOV062007年open赛题目和测试数据的网址http://ace.delos.com/OPEN07以此类推2、日本ACM比赛http://www.acm-japan.org/http://icpc2010.honiden.nii.ac.jp/en/past-contests3、官方网站02年网址http://icpc.baylor.edu/past/icpc2002/regionals/report.html03年以后改2002到2003即可。部分有测试数据4、德国的http://www
阅读全文
摘要:dp,详细说明在代码中//在最优解中,一个邮局肯定分管了一部分的村庄,那么通过枚举最后一个邮局所分管的范围,(由于坐标上的n个点,
//离这N个点距离之和最短的点一定是这些点的个数的中位数,如果N为偶数,那么这个点一定在包含中位数的区间整个范围内
//包括边界点)通过最后一个邮局的分管范围可确定最后一个邮局的位置,并且可得最后一个邮局所分管的村庄到这个邮局的最短距离之和,
//就可得到到状态转移方程:
// f(i,j)=min{f(i,k-1)+sum(k,j)}(i=<k<=j),其中f(i,j)表示总共i个邮局分管村庄1——j,sum表示最后一个邮局的所分管范围
// 的距离
阅读全文
摘要:最最基础的dp,刚刚开始刷dp题,想了一到自认为很难理解的dp题(网上说是水题,但对于菜鸟我来说,貌似有点难度),想了一下午都没想清楚他的原理,先水这一道题,之后再仔细想想那道“水”题的原理#include <iostream>
using namespace std;
const int maxn=101;
int tri[maxn][maxn],f[maxn][maxn];
int n;
int main()
{ while(cin>>n) { int i,j; for(i=1;i<=n;i++) { for(j=1;j<=i;j++) cin>&
阅读全文
摘要:气死我啦!!!!!!!!!!!!!,因为第十行的x,y错写成maxn,导致N此TLE,靠,还让我调了两个小时,为什么这么粗心,以后碰到这种情况,先从头到尾的把代码看一遍,看是否犯了什么低级错误dp,记忆化搜索#include <iostream>
using namespace std;
const int maxn=101;
int map[maxn][maxn];
int dis[maxn][maxn];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int r,c;
int dfs(int x,int y)
{ if(dis[x][y]
阅读全文
摘要:此题数据规模不大,可以通过暴力水过,代码如下#include <iostream>
using namespace std;
const int maxn=101;
int num[maxn][maxn]; int n;
int getM()
{ int i,j,k,i2,j2; int f[maxn]; int max=-1<<20,sum; for(i=1;i<=n;i++) { memset(f,0,sizeof(f)); for(j=i;j<=n;j++) { for(k=...
阅读全文
摘要:多重背包问题,在网上看了背包九讲的前三篇,但感觉还是理解的不够透彻,过一段时间集中搞一下dp,现在就当预习啦#include <iostream>
#include <cmath>
using namespace std;
int f[20001*6],m[7];
int main()
{ int t=0; while(cin>>m[1]>>m[2]>>m[3]>>m[4]>>m[5]>>m[6]) { t++; int i,sum=0; for(i=1;i<=6;i++) { sum+=m[
阅读全文
摘要:哎,折腾了一中午,终于ac拉。考察的是欧拉算法的扩展。我在此题中,思考的时间最长的部分就是通过扩展了欧拉算法得到了解后,如何得到最小的正整数解。对于这个小问题,我却百思不得其解。然后在网上找了解题报告后,才有了思路,就是先求出解系,然后通过这个解系的式子得到最小的整数解#include <iostream>
#include <cmath>
using namespace std;
void gcd(long long a,long long b,long long &gcdd,long long &w,long long &t)
{ if(b=
阅读全文
摘要:数据量不大,可以直接枚举。首先确定所需要的最小进制,然后从此处向62进行枚举。然后就是关于求摸的问题。不可能把整个数先求出来。因为数很大,根本存不下。根据求摸公式可得结果a1a2a3a4...a(s)%(n-1)=(a1+a2+...a(s)))%(n-1)#include <iostream>
#include <cstring>
using namespace std;
char s[40000];
int get(char a)
{ if(a>='0'&&a<='9') return a-'0
阅读全文
摘要:数论唯一分解定理的应用,要注意负数的情况,想明白这个过程用了两个小时,后来因为一个while写成了if有调试了俩小时,为什么还是这么菜数论唯一分解定理的应用,要注意负数的情况,想明白这个过程用了两个小时,后来因为一个while写成了if有调试了俩小时,为什么还是这么菜
#include <iostream>
#include <cmath>
using namespace std;
int gcd(int a,int b)
{ if(b==0) return a; else return gcd(b,a%b);
}
int main()
{ long long n; w
阅读全文
摘要:很基础的一道数学题,不过感觉跑的太慢啊,422ms#include <iostream>
#include <cmath>
using namespace std;
const int maxn=1000001;
int vis[maxn],p[maxn];
int t;
void prime()
{ t=0; int i,j; int n=(int)sqrt(maxn-1); for(i=2;i<=n;i++) { if(!vis[i]) { p[t++]=i; for(j=i*i;j<=maxn-1;j+=i) vis[j]=1; } }
}
i...
阅读全文
摘要:在网上看的解题报告,推到了一会,终于想明白了这个过程,先写出c关于b的关系式,通过枚举b看是否符合c是整数的条件,然后确定界的问题,根据式子首先可确定b>a,因为b和c在关系式中具有对称性,那么可让b永远都<=c(b和c的关系就三种),通过b-c<=0确定上界,然后通过f=c+b求导可知,在枚举b的范围内f是递减的,所以从大到小枚举得到的第一个满足的,f就是最小,注意a*a比较大,要用unsigned long来定义a#include <iostream>
#include <cmath>
using namespace std;
int main()
阅读全文
摘要:最小费用,最大流的思想,也不知道怎么稀里糊涂就ac啦#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=102;
const int inf=2<<20;
int cost[maxn][maxn],flow[maxn][maxn],cap[maxn][maxn],d[maxn];
int n,m;
int solve()
{ queue<int> q; int i,vis[maxn],p[maxn],to
阅读全文
摘要:刚开始是用的邻接矩阵,一直wa,后来看了其他人的代码,又想了想,两个点之间有多条路径,不能只存储权值最小的,因为每个路径都可能是一个最短路的组成部分(但现在还不是想的太清楚),所以有多少条边,就存多少边的信息bellman-ford#include <iostream>
using namespace std;
const int maxn=501;
const int inf=2<<20;
int d[maxn],w[maxn*maxn],u[maxn*maxn],v[maxn*maxn];
int f,n,m,wm,t; bool bellman()
{ int i
阅读全文
摘要:bellman-ford算法,此题可看做最短路径问题,原因是,可把到源点的距离看做负值(自己建立的一个抽象模型,但不表示出来,考虑的时候按这个负值模型考虑)。那么求解此题,就是看有没有至少一个负权环,如果有的话,因为根据此题可知,所以包含这个负权环的任一路径且在这个负权环之后的所有节点都会是无穷小,源点到源点的某一路径一定包含这个负权环,所以只要这个负权环走过一定次数,一定会导致源点到源点的距离小于初始值,其实就是题目要求的大于初始值。不需要考虑正权环抵消对结果的影响,因为如果有正权环,完全可以不走这个正权环。因为从源点返回源点,至少会经过一个环,但如果没有负权环,就不会使得到的新距离小于初始
阅读全文

浙公网安备 33010602011771号