上一页 1 ··· 3 4 5 6 7 8 9 下一页
摘要: 题意:给定一个树形图,现在选择其中一个节点,为了从此节点到达所有的其他节点需要改变一些边的方向,求出最小需要修改的边数以及满足最优解的节点。。解法:树形dp,第一次随意指定一个点为根,然后根据子节点的信息更新父节点,dp[i][0]表示使得i节点能到达它所有子节点需要修改的边数。 第二次dp,根据第一次dp的结果,利用父节点的信息来更新子节点,dp[i][2]表示使得i节点到达其他所有节点需要修改的边数。 如果pre[i]指向i,那么dp[i][1]=dp[pre[i]][0]-1; 如果i指向pre[i],那么dp[i][1]=dp[pre[i]][0]+1; 1 #include<i 阅读全文
posted @ 2012-11-06 17:32 silver__bullet 阅读(583) 评论(0) 推荐(1) 编辑
摘要: A:...比赛的时候居然写挂了。。。A 1 #include<cstdio> 2 int main(){ 3 int y,k,n; 4 while(~scanf("%d%d%d",&y,&k,&n)){ 5 bool f=0; 6 for(int i=1;i*k<=n;i++){ 7 if(i*k>y){ 8 if(f)printf(" "); 9 printf("%d",i*k-y);10 f=1;11 ... 阅读全文
posted @ 2012-11-06 13:48 silver__bullet 阅读(253) 评论(0) 推荐(0) 编辑
摘要: 题意:一辆车从起点走到终点,途中有些加油站,给出每个加油站距离和油价,最后求从起点到终点最小费用,其中在起点有100升油,要求到终点至少也还有100升油。解法:dp[i][j]记录走到第i站升j升油的最小费用,用当前的合法状态去更新后一个状态。 需要注意的是最后一站不一定在终点,注意读入方式。。。。 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #define N 110 6 #define M 210 7 using nam 阅读全文
posted @ 2012-11-05 12:04 silver__bullet 阅读(265) 评论(0) 推荐(0) 编辑
摘要: 题意:给定n个物品,每个物品有两个价值,x,y,问能否从中选择一些物品(数量任意),使得sum(x)^2+sum(y)^2==s*s分析:二维费用的背包,dp[i][j]表示凑出两种费用分别为i,j的最小硬币数 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #define N 500 5 using namespace std; 6 const int inf=(1<<30); 7 int dp[N][N]; 8 int w1[N],w2[N]; 9 int ma 阅读全文
posted @ 2012-11-02 19:58 silver__bullet 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一棵树,求切出有n个结点的子树至少要切几条边。解法:dp[i][j]记录使得以i为根的子树有j个结点最少要切几条边 dp[i][j]=min(dp[i][j],dp[i][j-k]+dp[son[i]][k]) 最后统计答案时要注意,如果不是根节点还要+1...切掉这个节点与其父亲之间的边 1 #include<iostream> 2 #include<vector> 3 #include<cstring> 4 #include<algorithm> 5 #define N 200 6 using namespace std; 7 co 阅读全文
posted @ 2012-10-31 19:48 silver__bullet 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 250pt.题意:给定n块砖,编号0~n-1,选一定的砖摞起来,要求上面的砖编号比下面的大,并且偶数高度的不能放在奇数高度的上面,求最大高度。解法: dp[i][0]记录选完前i块并且此时最上面一块高度为偶数的最优解 dp[i][1]记录选完前i块并且此时最上面一块高度为奇数的最优解。。。250pt 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<algorithm> 5 #include<vector> 6 #define N 100 7 阅读全文
posted @ 2012-10-31 16:39 silver__bullet 阅读(199) 评论(0) 推荐(0) 编辑
摘要: 题目描述:...解法: 树形dp+分组背包。 dp[i][j]记录以i为根的子树分配j个用户时的最大收益,cnt[i]记录以i为根的子树有几个叶子节点,对于每个i,背包容量即为cnt[i]的大小。 将i的每个子节点看作一组,这组背包的物品重量即为1~cnt[son[i]],由于只能从每组中选出一种物品,所以可以看做分组背包。 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<vector> 5 #define N 3010 6 using names 阅读全文
posted @ 2012-10-29 21:31 silver__bullet 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 题目描述:求小于n且与n不互质的数的和。分析: 方法一:容斥原理。对n分解因式,利用容斥原理来n的因子的和即为答案。 方法二:考虑欧拉函数,n之前与n互质的数的和sum=n*euler(n)/2 如果gcd(n,i)=1,那么必有gcd(n,n-i)=1,所以与n互质的数应该是成对出现的,每一对的和就是n,所以总和就是n*euler(n)/2;容斥原理解法 1 #include<iostream> 2 #include<cstring> 3 #include<vector> 4 #define N 1000010 5 using namespace std; 阅读全文
posted @ 2012-10-28 21:22 silver__bullet 阅读(252) 评论(0) 推荐(0) 编辑
摘要: A. 排序,把h,m都相同的归为一类,找到最多的 A 1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<map> 5 #define N 100010 6 using namespace std; 7 struct H{ 8 int h,m; 9 }s[N];10 int hash[N];11 bool cmp(H a,H b){12 if(a.h!=b.h)return a.h<b.h;13 return a.m<b.m;14 }15 阅读全文
posted @ 2012-10-26 06:58 silver__bullet 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 分析:中国剩余定理的求解,其中a[i]与a[j]不一定互质。 对于非互质版的中国剩余定理可以通过迭代的办法来求。 对于最终的通解 ans=At+B,我们可以通过逐一合并两个方程来更新A B,最后来得到答案。 最初A=a[1],B=b[1];然后将A B 带入下一个方程得到(At+B)mod a[i]==b[i]..得到一个特解tt,然后在求出此方程通解,再带回到ans中更新A B... 依次类推。。。。 1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algo 阅读全文
posted @ 2012-10-24 17:10 silver__bullet 阅读(390) 评论(0) 推荐(0) 编辑
上一页 1 ··· 3 4 5 6 7 8 9 下一页