摘要: 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表示最后一个邮局的所分管范围 // 的距离 阅读全文
posted @ 2012-11-22 19:28 LJ_COME!!!!! 阅读(148) 评论(0) 推荐(0)
摘要: 最最基础的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>& 阅读全文
posted @ 2012-11-20 19:27 LJ_COME!!!!! 阅读(114) 评论(0) 推荐(0)
摘要: 气死我啦!!!!!!!!!!!!!,因为第十行的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] 阅读全文
posted @ 2012-11-18 19:56 LJ_COME!!!!! 阅读(139) 评论(0) 推荐(0)
摘要: 此题数据规模不大,可以通过暴力水过,代码如下#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=... 阅读全文
posted @ 2012-11-18 16:43 LJ_COME!!!!! 阅读(96) 评论(0) 推荐(0)
摘要: 多重背包问题,在网上看了背包九讲的前三篇,但感觉还是理解的不够透彻,过一段时间集中搞一下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[ 阅读全文
posted @ 2012-11-16 18:55 LJ_COME!!!!! 阅读(103) 评论(0) 推荐(0)
摘要: 哎,折腾了一中午,终于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= 阅读全文
posted @ 2012-11-13 15:09 LJ_COME!!!!! 阅读(110) 评论(0) 推荐(0)
摘要: 数据量不大,可以直接枚举。首先确定所需要的最小进制,然后从此处向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&# 阅读全文
posted @ 2012-11-12 16:43 LJ_COME!!!!! 阅读(129) 评论(0) 推荐(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 阅读全文
posted @ 2012-11-11 18:37 LJ_COME!!!!! 阅读(118) 评论(0) 推荐(0)
摘要: 很基础的一道数学题,不过感觉跑的太慢啊,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... 阅读全文
posted @ 2012-11-09 17:11 LJ_COME!!!!! 阅读(134) 评论(0) 推荐(0)
摘要: 在网上看的解题报告,推到了一会,终于想明白了这个过程,先写出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() 阅读全文
posted @ 2012-11-08 21:43 LJ_COME!!!!! 阅读(114) 评论(0) 推荐(0)