摘要:
递推。 用f[n][l][r]表示n个柱子,从左面能看到l个,从右面能看到r个。 如果我们按照从小到大的顺序放置的话,放置最高的柱子后,大量状态都能递推到当前状态,很难写出递推式。 但是我们如果从小到大放置的话,高度为1的柱子放进去只会产生3种不同的情况。 1.最左面.2.中间。3.右面 在中间的哪里是无所谓的。 所以f[i][j][k]=f[i-1][j-1][k]+f[i-1][j... 阅读全文
摘要:
递推,组合。 考虑第一名有i个人,则f[n]=sum(C(n,i)*f[n-i]),递推即可.. #include #include #include using namespace std; const int mod = 10056; const int maxn = 1000 + 10; int n=1000,T; int C[maxn][maxn]; int f[maxn]; ... 阅读全文
摘要:
递推。 用f[i]代表i个盒子的放法,设g[i]=2^n-f[i],代表i个盒子不满足条件的放法。 枚举第一个U所在的位置j。则方法有g[j-2]*(2^(i-j-2))种,j-1必须是L。 所以就慢慢递推了。。。 #include #include #include using namespace std; const int maxn = 100 + 10; int... 阅读全文
摘要:
状态压缩,记忆化搜索。 用一个5进制数来表示每堆排到了哪一个位置。和2进制是一样的,不过不能用位运算。 #include #include #include using namespace std; const int maxn = 2000000+10; double dp[maxn]; bool vis[maxn]; char s[10][10][5]; int v,v2; do... 阅读全文
摘要:
枚举,条件概率。 2^20次方等于100w,是大约可以没准还能过的。 二进制枚举时,如果买东西的人恰好为r个,设概率为p,就将sum[i]+=p(sum[i]为r个人买东西时第i个人买东西的概率),tot+=p(tot为r个人买东西的概率) 要求的就是sum[i]/tot。 P(第i个人实际买东西)=P(r个人买东西且第i个人在其中)/P(r个人买东西)。 r为0时特判 #inc... 阅读全文
摘要:
解码,暴力。 恬不知耻地把暴力题解放了上来,因为k比较小,直接暴力找到字符串第k大就可以了。 编码解码就是根据组合数学公式算出来它到底在哪。 dfs返回bool就能使得找到字典序第k大字符串以后退出dfs,节省时间。 #include #include #include using namespace std; const int maxl = 30; char s[3][maxl... 阅读全文
摘要:
筛法。 首先使cnt[i]=sqr(n/i),这样cnt[i]就表示gcd(x,y)大于等于i的数对的个数,然后倒序枚举减去gcd大于i的个数就可以得到ans[i]。最终得到ans[1]。 这个算法单次复杂度是O(n)的,和欧拉函数线性筛一样,不过更好写。 但是T=600,欧拉函数只需要计算一次,每次输出就可以了,所以在T很大的情况下还是欧拉函数更好。 反正水题。。。 #inclu... 阅读全文