解题:BOI 2008 Elect】的更多相关文章

题面 做背包时可以通过排序来使得转移满足某种限制或是让我们判断一个状态是否有贡献 这个题将人数从大到小排序后做背包,这样每次那个最小的党加入而使得答案合法时之前的党也都是合法的 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,M=; int n,sum,ans,half; int a[N],dp[M]; bool cmp(int a,int b) { return…
题目描述 N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党退出后,其它党的席位仍大于总数的一半,则这个政党被称为是多余的,这是不允许的. 输入格式 第一行给出有多少个政党.其值小于等于300 下面给出每个政党的席位数.总席位数小于等于 100000 输出格式 你的组阁方案中最多能占多少个席位. 输入输出样例 输入 #1复制 4 1 3 2 4 输出 #1复制 7 说明/…
题面 洛谷要求输出方案,懒得写了,但是还是放一下链接看看吧 (虽然现在二分图已经过气了=.=) 要求最长反链,最长反链=最小链覆盖,先Floyd传递闭包之后链覆盖就变成了边覆盖,然后最小边覆盖=总点数-最大匹配 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,M=,inf=1e9; int n,m,s,f,b,t,t1,t2,t3,cnt,ans; *M],goal…
题面 还可以这么搜......学到了(PoPoQQQ orz) 我们最朴素的做法是枚举所有状态(当然可以剪,剪完最终实际状态量也是$C_{26}^{13}$的),然后每次$O(n)$扫一遍判断,大概会T炸,考虑优化 我们先预处理每个状态中$1$的数目和连边的状态,然后压缩状态初始让一边集合为空,一边集合为全集,这样每次从已有的点的前面$\frac{n}{2}$个点中枚举一个加入另一边,就可以边搜边更新边数而不用最后$O(n)$检查了.另一个问题是数组可能非常大,这里我们可以把状态拆成前后两半,然…
题面 如果没有两个数不能相同这个限制就两个数组排序后贪心即可.现在加上这个限制,注意到每个数组中的数是两两不同的,所以每次一定能在前面或后面一个数中找一个换过来,这样每次考虑相邻三个数转移就可以了,注意特判一下边界. #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; long long a[N],b[N],dp[N],n,…
题面 原来看过然后没做,结果板板把这道题改了改考掉了,血亏=.= 首先看看有没有符合条件的点.如果没有开始寻找解,先把所有的大于$2*k$的点设为坏点,然后求最大子矩形,只要一个最大子矩形的权值和超过$2*k$则它的一个子矩形一定可以成为解.因为这时所有点都小于$k$,这个最大子矩形既然权值和超过$2*k$那么一定是有一部分落在所求的区间中,然后逐行/列枚举切一下是一定有解的. 注意最大子矩形的边界(为什么你们的最大子矩形都要做两遍啊=.=) #include<cstdio> #include…
题面 水水的换根裸题,不过以前还真没做过换根的题 换根的思想就是在DFS中利用树的信息更新出当前点为根时的信息,具体来说一般是考虑子树外和子树内两部分 每个点的答案$ans$就是$ans[fa]+n-2*siz[nde]$ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; *N],goal[*N]; int p[N],dep[N],siz[N]; int n,t1,…
题面 这大概不算是从零开始的DP学习系列,这不是最大子矩形吗=.= 定义$dp[x][y][xx][yy]$表示第一张地图中右下角为$(x,y)$,第二张地图中右下角为$(xx,yy)$的最大公共子矩形,然后$n^4$枚举位置,在数字相同时从左/上/左上转移即可 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ][N][N],dp[N][N][N][N]; lon…
题面 搞了一晚上斜率优化,大概懂了一点,写写 原来常用的优化dp方法:做前缀和,预处理,数据结构维护 现在有转移方程长这样的一类dp:$dp[i]=min(dp[i],k[i]*x[j]+y[j]+c[i]+a)$,其中$c[i],k[i],x[j],y[j]$都是关于$i$或者$j$的变量,在$i$或者$j$确定时不变,$a$是个常量 然后发现$x[j]$带着一个$k[i]$的系数,不好优化 从另一个角度考虑,想想高中老师教给我们的线性规划 可以发现因为对于每次转移的$i$来说$c[i],k[…
题面 我们很容易想到差分约束,但是我们建出来图之后好像并不好下手,因为我们只能得到砝码间的大小关系,并不能容易地得到每个砝码的具体重量. 于是我们有了一种神奇的思路:既然得不到具体重量我们就不求具体重量了,只求出砝码间的关系即可,因为砝码只有三种还是可以讨论的.具体来说我们用$maxx[i][j]$表示$i-j$的最大值,$mini[i][j]$表示$i-j$的最小值,然后跑Floyd得出砝码间的关系,最后直接$n^2$枚举砝码检查即可 #include<cstdio> #include<…