寒假十

1分类讨论 最少删除数字是否是 3的倍数
这种题 都是数位分离 和暑假集训那道题差不多
好几个坑点 分类讨论 7种情况
for(auto x:s){
a[(x-'0')%3]++; //非常细节
sum+=x-'0';
}
2
猜结论 每个数模m 等于ai-1 就是lcm(a[1]到a[m])的最小公倍数
3 贪心 先考虑负数,正数个数 然后观察性质 对于首位都会受到影响 偶数个没有变化 奇数个必然会牺牲一个绝对值最小的

sum+=abs(x)
讨论多少个负数 -++- 修改是不会影响正数的
-++-

--

++++ 只会改变一头一尾巴
奇数个负数 将一个负数换为绝对值最小的整数替换掉
4 一个前缀最大值 1到i-1 b[i]的max
一个是前缀和 now+=s[i] 每一次操作的效果 保证下一次有效递推 不是贪心,只是模拟过程超出最大值
5

include <bits/stdc++.h>

using namespace std;

define int long long

const int N = 2e5 + 10;
const int mod = 1e9 + 7;
double f[101][101][101]; // 用于存储每个状态的期望操作次数

void dp() {
// 从边界状态开始,逆序计算
for (int a = 99; a >= 0; --a) {
for (int b = 99; b >= 0; --b) {
for (int c = 99; c >= 0; --c) {
// 只有当硬币总数大于0时才计算
if (a + b + c > 0) {
f[a][b][c] = 1.0;
if (a + 1 <= 100) f[a][b][c] += a * f[a + 1][b][c] / (a + b + c);
if (b + 1 <= 100) f[a][b][c] += b * f[a][b + 1][c] / (a + b + c);
if (c + 1 <= 100) f[a][b][c] += c * f[a][b][c + 1] / (a + b + c);
}
}
}
}
}

signed main() {
int a, b, c;
cin >> a >> b >> c;

// Initialize boundary conditions
for (int i = 0; i <= 100; ++i) {
    for (int j = 0; j <= 100; ++j) {
        f[100][i][j] = 0;
        f[i][100][j] = 0;
        f[i][j][100] = 0;
    }
}

// Compute the dp table
dp();

// Output the result
printf("%.10f", f[a][b][c]);

}

return f[a][b][c]=1+adfs(a+1,b,c)/(a+b+c)+bdfs(a,b+1,c)/(a+b+c)+c*dfs(a,b,c+1)/(a+b+c);
要么逆序递推过去 从目标到开始
要么记忆化dfs存拓展的状态 从开始到目标
6 折半搜索 (子集枚举加二分)
int c[1<<21];
int k=upper_bound(c,c+(1<<20)+1,t-sum)-c-1;
if(k>=0)ans=max(ans,sum+c[k]);
不是c[1<<k] k本身就是在1到1<<20中的下标
7
树上任意点对之间的异或之和
对于异或求和问题 每一个单独考虑 并且性质 dx^dy 1到以dx为根 1到以dy为根
dfs(1,0)通过递推(递归)的方式,最终我们可以得到每个节点相对于根节点的路径异或和 dis[i.to] = dis[x] ^ i.w; i是x的子节点 异或上子节点的边权就行

这道题不注意取模细节绝对会挂分
// ans+=cnt(n-cnt)%mod(1LL<<i)%mod;
// ans%=mod;
ans=(ans+(1LL<<i)%modcnt%mod(n-cnt)%mod)%mod;

posted @ 2024-05-21 17:58  爱吃湫鰍的喵酱  阅读(11)  评论(0)    收藏  举报