topcoder srm 691 div1 -3
1、给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$。增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x})$,增加边$(x,n)$。最后使得顶点0和1相连。有多少种$M$?
思路:设从0开始可以遍历的顶点集合为$A$,从1可以遍历的顶点集合为$B$,$C=A\bigcap B$。令$A^{'}=A-C,B^{'}=B-C$。那么有下面的情况:
(1)在$C$中选择一些点(至少一个),从$A^{'},B^{'}$中任意选点;
(2)在$C$中不选择点,从$A^{'},B^{'}$中任意选点(不能为空);
(3)假设$C$不为空,那么可以不从$A^{'},B^{'},C$中选择。
对于不在$A^{'},B^{'},C$中的点都是随便选。
#include <stdio.h>
#include <string>
#include <stack>
#include <vector>
#include <string.h>
#include <algorithm>
#include <assert.h>
using namespace std; const int N=55; #define B(x) (1ll<<(x)) class Sunnygraphs {
public:
long long count(vector<int> a)
{
int n=(int)a.size();
vector<int> mask(n);
for(int i=0;mask[i]<1;i=a[i]) mask[i]|=1;
for(int i=1;mask[i]<2;i=a[i]) mask[i]|=2;
int c[4]={0,0,0,0};
for(int i=0;i<n;++i) ++c[mask[i]]; long long ans=0;
ans+=(B(c[3])-1)*B(c[1])*B(c[2]);
ans+=(B(c[1])-1)*(B(c[2])-1);
if(c[3]) ++ans;
ans<<=c[0];
return ans;
}
};
2、给定$n$组数字$(a_{i},b_{i})$,$n$为偶数。现在重新排列这$n$组数字,得到新的$(A_{i},B_{i})$,使得下面的值最大:
$ans=\sum_{i=1}^{\frac{n}{2}}(B_{i}\sum_{j=1}^{i}A_{j})+\sum_{i=\frac{n}{2}+1}^{n}(B_{i}(X+\sum_{j=1}^{i}A_{j}))$
其中$2\leq n\leq 50,1\leq a_{i}\leq100000,1\leq b_{i}\leq10,0\leq X\leq 100000$
思路:现在考虑考虑最后分在前一半的两组$(A_{i},B_{i}),(A_{j},B_{j})$,若$i$在前优于$j$在前,那么$A_{i}B_{i}+(A_{i}+A_{j})B_{j}\geq A_{j}B_{j}+(A_{i}+A_{j})B_{i}$,即$A_{i}B_{j}\geq A_{j}B_{i}$。
由于$b_{i}$较小,现在枚举最后后一半的数字的所有的$A_{i}$之和$S$,那么现在对于一个数对,可以直接枚举它在前一半还是后一半(现在不管它在前一半还是后一半都可以直接计算对答案的贡献),这样可以进行动态规划。令$f[i][j][k]$表示现在已经考虑了$i$个数字,后一半数字的个数为$j$,后一半数字的$B$之和为$k$能得到的最大值,答案为$f[n][n/2][S]$。
#include <stdio.h>
#include <string>
#include <stack>
#include <vector>
#include <string.h>
#include <algorithm>
#include <assert.h>
using namespace std; int cmp(pair<int,int> a,pair<int,int> b)
{
return a.first*b.second<b.first*a.second;
} int f[55][33][505]; int A[55],B[55]; void up(int &x,int y)
{
if(x<y) x=y;
} int n; void DP(const int NextSumB,const int X)
{
memset(f,-1,sizeof(f));
f[0][0][0]=0;
int pre=0;
for(int i=1;i<=n;++i)
{
pre+=B[i];
for(int j=0;j<=n/2;++j) for(int k=0;k<=pre;++k)
{
if(f[i-1][j][k]>=0)
{
up(f[i][j][k],f[i-1][j][k]+A[i]*(pre-k)+A[i]*NextSumB);
up(f[i][j+1][k+B[i]],f[i-1][j][k]+A[i]*B[i]+A[i]*k+X*B[i]);
}
}
}
} class Moneymanager {
public:
int getbest(vector<int> a,vector <int> b,int X) {
vector<pair<int,int> > p;
n=(int)a.size();
int sum=0;
for(int i=0;i<n;++i) {
p.push_back(make_pair(a[i],b[i]));
sum+=b[i];
}
sort(p.begin(),p.end(),cmp);
for(int i=1;i<=n;++i)
{
A[i]=p[i-1].first;
B[i]=p[i-1].second;
} int ans=0;
for(int i=0;i<=sum;++i)
{
DP(i,X);
ans=max(ans,f[n][n/2][i]);
} return ans;
}
};
topcoder srm 691 div1 -3的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- topcoder srm 575 div1
problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...
随机推荐
- php 数据库备份还原
public function exportDatabase(){ $data = input(); //备份数据库 $host="192.168.0.123"; $user=&q ...
- VS2013打包程序步骤
VS自带的打包程序默认是没有安装的,如果有打包的需要,需要自己去下载一个安装程序 1.右击解决方案,选择添加项目,在打开的对话框中找到[已安装]-[模板]-[其他项目]-[安装和部署],如图示.第一 ...
- aic bic mdl
https://blog.csdn.net/xianlingmao/article/details/7891277 https://blog.csdn.net/lfdanding/article/de ...
- 如何在Sitecore CMS中打开内容编辑器
在Sitecore中开发网站时,大多数项目管理都来自内容编辑器.创建,删除,修改,移动,发布,排序和查看项目只是可以在Content Editor界面中处理的众多任务中的一小部分. 由于内容编辑器对于 ...
- 【Redis学习之五】Redis数据类型:列表和散列
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-2.8.18 一.列表 基于Linked Lis ...
- OBO文件格式1.2
该文件每一行都是一个键值对,基本格式为: 键: 值!注释 总体结构: 文件头 !包含若干行总体说明 词条1 ![词条类型]占第一行,后跟若干行说明 词条2 ! ...
- mybatis源码解析4---Configuration解析
Configuration类解析 Configuration类位于mybatis包的org.apache.ibatis.session目录下,是mybatis的全局变量,属性就是对应于mybatis的 ...
- python PIL 图像处理操作
python PIL 图像处理 # 导入Image库 import Image # 读取图片 im = Image.open("1234.jpg") # 显示图片 im.show( ...
- Android平台MediaCodec避坑指北
https://www.jianshu.com/p/5d62a3cf0741 最近使用MediaCodec做编解码H264,写一点东西以免自己再次掉坑. 先说一下具体环境,使用的是,Windows10 ...
- 四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲(转)
源: 四轴飞行器1.7 NRF24L01P无线通讯和改进型环形缓冲