摘要: 题目地址:http://poj.org/problem?id=3984利用图论中深搜的思想,存在边就是x,y -> x+1,y 还有x,y -> x,y+1 然后仍然是访问未访问的而且不是墙壁的地方。 这样保证不走已经搜索过,走不通的路。唯一一种需要重复访问已经访问的结点的情况是已经无路可走了,只能返回,这样就在栈中将路径取出来,把自己现在的那个先pop掉,然后实现回溯。最后用向量实现栈的自底输出。代码:IDUserProblemResultMemoryTimeLanguageCode LengthSubmit Time12143517814jingqi3984Accepted72 阅读全文
posted @ 2013-09-25 18:03 814jingqi 阅读(597) 评论(0) 推荐(0) 编辑
摘要: 题目地址:http://poj.org/problem?id=1905思路:列出方程 2*R*x=L‘ 2*R*sin(x)=L 两式相除即得 x/sin(x) = 1+n*c 前提x!=0 就是 n*c>0 答案就是 L/2* (1/sin(x)-1/tan(x)) 三角函数化简为 L/2*tan(x/2) x 在0~ PI/2 于是关于x是单增的, 反函数也是单增的,x/sin(x) 也是单增的一开始的思路是先用 二分把x/sin(x) = 1+n*c 里面的x解出来,然后带进L/2*tan(x/2) 计算 虽然样例过了,但是还是wa... 阅读全文
posted @ 2013-09-25 15:15 814jingqi 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 题目地址:http://poj.org/problem?id=3122还是找到了单调函数--分给m人对最大尺寸f(m) 是m的不增函数,那么具体给定m是,二分f(m)使用>=f+1 l=mid 而不是>来保证尽可能取得大细节: 应该直接二分答案,而不是算出比较精确的半径平方,最后*PI输出,会产生误差,然后PI用arccos(-1),否则也会wa代码:#include #include #include using namespace std; //const double PI=3.1415926535; //这样写就wa了 是精度不够? const double PI=acos 阅读全文
posted @ 2013-09-25 02:19 814jingqi 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3366思路: 题目就是要求函数(h*D-H*x)/(D-x)+x 的最大值,其中 x>=0 x #include using namespace std; int main() { int T; cin>>T; long double H,h,D; while(T--) { cin>>H>>h>>D; long double ans=D*H-D*h; ans=sqrt(ans); ans... 阅读全文
posted @ 2013-09-24 23:43 814jingqi 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 题目地址:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1645思路: 图论模型化,种类数就是点,对数就是边, 要求始终不存在子图使点数等于边数,就是不允许有环,使用并查集即可。代码:#include #include #define N 100001 using namespace std; int p[N+5]; int find(int x) { return p[x]==x?x:p[x]=find(p[x 阅读全文
posted @ 2013-09-24 21:43 814jingqi 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4717第一次写三分,这个解法是学解题报告的,感谢原作者。首先对每对点对,他们的距离关于时间t是二次函数,现在就是求c[n][2] 个二次函数,每个点取最大值构成的函数的极值。 由于每个子函数都是先减后增,或者对称轴小于0,直接单增,他们的max一定也保持着这个性质 (具体证明和n个下凸函数max还是下凸函数很像?)然后取100次精度就够了代码:#include #include #include using namespace std; int x[300],y[300],vx[300],vy[3. 阅读全文
posted @ 2013-09-23 23:30 814jingqi 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 题目地址:http://poj.org/problem?id=3258题目思路: 首先,如果只减少一部,那么一定要干掉最短的那段距离(一旦不消灭,最小的还是它,并没有达到使最小值取最大的理想情况)。 但是如果有很多边取到最小,具体去除哪一个点就有点麻烦了。如果两个最小距离连着,去除公共点最好。 如果没有连着,四个点分别考虑紧邻的,取最小的。 如果多于两条线段取最小随便去,如果仅有一条取最小仍是去紧邻较小的点。 很麻烦就是了。基于这样的思想,每次去掉一个顶点后,再取出最小边,同样处理(借助优先权队列) 。不知这样的贪心是不是对的...有一个二分答案的做法,现学的.一般的二分查找是 while(. 阅读全文
posted @ 2013-09-22 02:20 814jingqi 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4712首先,算汉明距离就是二进制异或以后的1的个数,统计1的个数用x&=x-1很快很神奇。用if(x&1) {count++; x>>=1;} 在位数比较多的时候会慢一些。然后就是看题解学到的神奇的“随机”! 来取到“任意的两个” 1w次wa,但是10w次就不会,20组testcase ,不会超时;真的ac了,很神奇代码:#include #include #include #include #include using namespace std; int a[1000 阅读全文
posted @ 2013-09-21 20:28 814jingqi 阅读(128) 评论(0) 推荐(0) 编辑
摘要: 题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3432题目思路: 其实就是找那个只出现了1次的字符串。 但是如果用数组或者map记录出现的次数,10w的数量会导致超时,学到一种神奇的方式--直接用异或处理先看代码:#include #include #include using namespace std; string s; char sock[9]; char ans[9]; int main() { int n; cin>>n; while(cin>>n) { g... 阅读全文
posted @ 2013-09-20 23:21 814jingqi 阅读(133) 评论(0) 推荐(0) 编辑
摘要: 题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4113思路:这个就是三维数组的地址和下标之间的对应。 然后涉及到一定的变换 ,我们有一个p【a】 记录在若干次对换之后实际对应的是哪个数。 同时,为了能用find函数找回坐标,我们还要记录反函数(写作pp【a】)然后这个value超过的xyz是不要输出的。代码:#include #include #include #include using namespace std; int p[1010]; int q[1010]; int r[1010]; int ... 阅读全文
posted @ 2013-09-20 21:58 814jingqi 阅读(139) 评论(0) 推荐(0) 编辑