摘要: 以前做过类似的题目,所以很快就有思路了。首先判断marbles的总价值是否是偶数,如果不是的话,显然不能对半分。如果总价值是偶数,则变成背包问题,判断是否有marbles的组合的价值为总价值的一半。第一次试,循环的上下界设的比较宽,超时了。然后想了一下,觉得可以做一些限制,把这些限制加了以后,就过了。#include <iostream>using namespace std;const int MAX_MARBLE = 20005;int ans[MAX_MARBLE * 6];/* marbles可能达到的最大价值是MAX_MARBLE * 6 */void readMarbl 阅读全文
posted @ 2012-08-10 19:46 peaceful 阅读(168) 评论(0) 推荐(0)
摘要: 今天做一个题目,用到sort()来排序。原来的比较函数式这样的:int cmp (stickClass s1 , stickClass s2){ if (s1.len != s2.len) return s1.len > s2.len; else return s1.weight >= s2.weight;/* >= */}运行时报错了,错误定位在“algorithm.h”里面。基本上能确定是sort()出了问题。我去问同学,同学给我发了一个网址:http://support.microsoft.com/kb/949171这个页面的大致内容是,在VC20... 阅读全文
posted @ 2012-08-08 19:24 peaceful 阅读(153) 评论(0) 推荐(0)
摘要: 本题求最大上升子序列,这个很容易看出来。数据大小是50万,所以不能用O(n^2)的方法来求。因为1000万以上次循环就可能超时。若用二分来解决,时间复杂度为O(nlogn)。代码使用了我认为的最经典的二分形式。#include <iostream>using namespace std;const int MAXCITYNUM = 500005;int poorCity[MAXCITYNUM],ans[MAXCITYNUM];int main (){int caseNum = 1,cityNum; while (scanf("%d",&cityNum) 阅读全文
posted @ 2012-08-06 22:07 peaceful 阅读(177) 评论(0) 推荐(0)