- 博客(22)
- 收藏
- 关注
原创 BZOJ1079: [SCOI2008]着色方案
题解这题是DP,一开始的想法是写一个5^15的dp,但是肯定会超时,所以就要换一个定义。 我们开dp数组 f[a][b][c][d][e][last] 记录剩下1,2,3,4,5次可涂色次数的颜色的油漆种数为a,b,c,d,e,上一次我们涂的是使用次数剩余为last的颜料。这次在剩余last-1次的颜料中,我们只能少拿一次,那么就可以推出转移式子,用记忆化dfs求解。#include
2018-01-22 16:37:43 281
原创 BZOJ1012: [JSOI2008]最大数maxnumber
题解线段树= = 代码如下:#include#includeusing namespace std;const int maxn=200005;int n,tt,tail;long long las;struct dyt{ int l,r,w;}tree[4*maxn];inline int read(){ int x=0; char ch=getch
2018-01-21 21:10:24 191
原创 BZOJ1008: [HNOI2008]越狱
题解这题显然是数学题,组合数学。正难则反,先考虑不会越狱的情况:第1个犯人信仰某宗教,一共m个选择。第2个则只有m-1个选择,… ,往后均为m-1个选择。所以答案易知,就是mn−m∗(m−1)n−1。快速幂套mod就行了。
2018-01-21 20:58:46 210
原创 BZOJ1293: [SCOI2009]生日礼物
这题和noip2016普及组的第三题类似啊= =,直接哈希动态做一下就好了。 代码如下:#include#include#includeusing namespace std;const int maxn=1000005;int n,m,n1,tail,ans,hsh[maxn];struct dyt{ int x,id; bool operator cons
2018-01-21 20:15:59 244
原创 BZOJ2456: mode
题解:这题还是蛮有意思的,因为内存上限只有1m,所以不能开数组处理。我们发现题目中的众数是大于n/2的,所以我们可以只存一个量,每次读入不同则相互消去,最后剩下的一定是这个众数。 代码如下:#include#includeint n,x,y,sum;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){
2018-01-21 20:08:38 344
原创 BZOJ3436: 小K的农场
题解:差分约束的入门题,用spfa刷环就好了。 代码如下:#include#include#includeusing namespace std;const int maxn=100005;int n,m,tot,dis[maxn],lnk[maxn],w[2*maxn],son[2*maxn],nxt[2*maxn];bool vis[maxn],pd;inline
2018-01-21 19:41:06 193
原创 BZOJ1084: [SCOI2005]最大子矩阵
题解:这题显然是DP。定义f[i][j][k]表示前i行j列里有k个矩阵的最大元素总和。因为m代码如下:#include#include#includeusing namespace std;const int maxn=105,maxk=15;int n,m,n1,ans,a[maxn][3],f[maxn][maxn][maxk],s[maxn],sum[maxn][2
2018-01-19 23:01:01 242
原创 BZOJ1051: [HAOI2006]受欢迎的牛
题解:这题是比较典型的tarjan缩环问题,只要刷一次tarjan就可以刷出答案。 代码如下:#include#includeusing namespace std;const int maxn=100005,maxm=500005;int n,e,lnk[maxn],son[maxm],nxt[maxm],tot,dfn[maxn],low[maxn],stark[maxn
2018-01-19 22:46:48 227
原创 BZOJ1083: [SCOI2005]繁忙的都市
题解仔细一看,会发现是克鲁斯卡尔的经典题,只要刷一次就行了。 代码如下:#include#include#includeusing namespace std;const int maxn=305,maxm=10005;int n,m,ans,fa[maxn];struct dyt{ int x,y,z; bool operator const dyt &
2018-01-19 22:39:10 284
原创 BZOJ1054: [HAOI2008]移动玩具
题解:广搜+哈希,水题。 代码如下:#include#includeusing namespace std;const int maxn=65540,flg[4][2]={{-1,0},{0,1},{1,0},{0,-1}};int step[maxn],t;bool que[maxn][5][5],b[5][5],hsh[maxn];inline int read(){
2018-01-16 21:00:42 256
原创 BZOJ1192: [HNOI2006]鬼谷子的钱袋
题解水题。 你要选的数肯定是1,2,4….2^k,答案就是k+1。k就等于⌊log^2 n⌋+1。 代码如下:#includeusing namespace std;int n,ans=0;int main(){ scanf("%d",&n); for(;n;n>>=1) ans++; printf("%d\n",ans); return 0;
2018-01-15 21:01:10 164
原创 BZOJ4337: BJOI2015 树的同构
题解树哈希。因为节点可以重新标号,直接把一棵树的每一个节点当做根来做哈希再判断一下就好了。 代码如下:#include#include#include#includeusing namespace std;const int maxn=55,pow=2333,tt=1000000007;int m,n,tot,s[maxn],lnk[maxn],son[2*maxn],n
2018-01-13 21:46:25 312
原创 BZOJ1260: [CQOI2007]涂色paint
题解:水题,区间dp。 代码如下:#include#include#includeusing namespace std;const int maxn=55;int n,a[maxn],f[maxn][maxn];char s[maxn];int main(){ scanf("%s",s); n=strlen(s); for (int i=0;i1]=s
2018-01-13 21:39:00 350
原创 BZOJ1024: [SCOI2009]生日快乐
题解:n这么小,不爆搜对不起题面。。。 代码如下:#include#includeusing namespace std;int t;double n,m;double dfs(double x,double y,int z){ if (z==1) {if (xreturn x/y;} double ans=1e20; for (int i=1;i<
2018-01-13 21:35:54 261
原创 BZOJ1854: [Scoi2010]游戏
题解这题其实是二分图最大匹配。可以把1~1000000的属性和1~n的武器相连边,然后从1开始刷二分图匹配,刷到无法匹配就停下来并输出答案。 代码如下:#include#include#includeusing namespace std;const int maxn=10005,maxm=1000005;int n,m,tot,girl[maxm],lnk[maxm],s
2018-01-13 20:59:16 243
原创 BZOJ1433: [ZJOI2009]假期的宿舍
题解:匈牙利算法的经典题。。。不再赘述。 代码如下:#include#include#includeusing namespace std;const int maxn=55,maxm=2505;int T,n,m,tot,ans,a[maxn],b[maxn],girl[maxn],lnk[maxn],son[maxm],nxt[maxm];bool used[maxn
2018-01-13 20:50:36 202
原创 BZOJ1022: [SHOI2008]小约翰的游戏John
题解:这题是经典的nim游戏,判断能不能获胜,只要将每一堆的个数xor起来,再判断一下就好了。#include#includeusing namespace std;int T,n;inline int read(){ int x=0; char ch=getchar(); while (ch'0'||ch>'9') ch=getchar(); whil
2018-01-13 20:44:34 197
原创 BZOJ1055: [HAOI2008]玩具取名
题解:一道简单的dp题。定义f[i][j][c]表示i~j这一区间中的所有字母能否缩成c这一字母。转移就是:f[i][j][c]=f[i][k][c1]&& f[k+1][c2]&&(c1c2>>c,i代码如下:#include#include#includeusing namespace std;const int maxn=205;int n,a[5][maxn],hs
2018-01-13 20:41:21 181
原创 BZOJ1296: [SCOI2009]粉刷匠
题解:这题比较简单,可以用dp+0/1背包来解决。首先对每一条木板都刷一趟dp,求出f[i][m][j]表示第i个木板刷了j次可以正确粉刷的格子总数。然后对于所有的木板做一次0/1背包。最后输出f1[n][t]即可。#include#includeusing namespace std;const int maxn=55,maxm=2505;int n,m,t,a[maxn][m
2018-01-12 21:47:30 170
原创 BZOJ1002: [FJOI2007]轮状病毒
题解:找规律题:f[i]=(f[i-1]*3-f[i-2]+2),套一个高精度就好了。 代码如下:#include#includestring>using namespace std;const int maxn=105,maxl=1005;int n,f[maxn][maxl],len[maxn];void add(int x){ int a=x-1,b=x-2;
2018-01-12 21:41:12 298
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人