20240324比赛总结
T1 卫星照片
https://gxyzoj.com/d/hzoj/p/3657
bfs暴力找联通块,再暴力判断即可
因为某些原因代码丢了,就不放了
T2 [luogu3802]小魔女帕琪
https://gxyzoj.com/d/hzoj/p/3656
考虑到,前7个均不同的概率为
因为每种情况均有
接着考虑后面的情况,以第二个为例,方案数为:
化简得:
所以答案为:
代码:
#include<cstdio>
using namespace std;
int a[10],n;
double ans=1.0;
int main()
{
for(int i=1;i<=7;i++)
{
scanf("%d",&a[i]);
n+=a[i];
ans*=a[i]*i;
}
for(int i=0;i<=5;i++)
{
ans/=1.0*(n-i);
}
printf("%.3lf",ans);
return 0;
}
T3 [NOIP2016 普及组] 魔法阵
https://gxyzoj.com/d/hzoj/p/3655
设
因为
可以枚举
枚举
同理枚举
代码:
#include<cstdio>
using namespace std;
int n,m,val[40004],cnt[15005],A[15005],B[15005],C[15005],D[15005];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&val[i]);
cnt[val[i]]++;
}
for(int t=1;t*9<=n;t++)
{
int sum=0;
for(int d=t*9+2;d<=n;d++)
{
int a=d-t*9-1;
int b=a+2*t;
int c=d-t;
sum+=cnt[a]*cnt[b];
C[c]+=sum*cnt[d];
D[d]+=sum*cnt[c];
}
sum=0;
for(int a=n-t*9-1;a>0;a--)
{
int b=a+2*t;
int d=a+t*9+1;
int c=b+6*t+1;
sum+=cnt[d]*cnt[c];
A[a]+=sum*cnt[b];
B[b]+=sum*cnt[a];
}
}
for(int i=1;i<=m;i++)
{
printf("%d %d %d %d\n",A[val[i]],B[val[i]],C[val[i]],D[val[i]]);
}
return 0;
}
T4 [HAOI2016] 字符合并
https://gxyzoj.com/d/hzoj/p/3298
看到数据范围,考虑区间dp+状压dp,设
因为最优的情况一定是将所有能合并的合并,且若暴力枚举断点,一定会T,考虑优化
1个字符可以不操作,m个连续字符可以合并成1个字符,于是得到
所以,可以枚举所有能转移的点k求最大值,但当
代码:
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int n,m,a[305],c[305];
ll w[305],dp[305][305][305],g[5];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int s=0;s<(1<<m);s++)
{
dp[i][j][s]=-2e9;
}
}
}
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
dp[i][i][a[i]]=0;
}
for(int i=0;i<(1<<m);i++)
{
scanf("%d%lld",&c[i],&w[i]);
}
for(int len=2;len<=n;len++)
{
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
int tmp=(len-1)%(m-1);
if(tmp==0&&len!=1) tmp=m-1;
for(int k=j;k>i;k=k-m+1)
{
for(int s=0;s<(1<<(tmp+1));s++)
{
dp[i][j][s<<1]=max(dp[i][k-1][s]+dp[k][j][0],dp[i][j][s<<1]);
dp[i][j][s<<1|1]=max(dp[i][k-1][s]+dp[k][j][1],dp[i][j][s<<1|1]);
}
}
if(tmp==m-1)
{
g[1]=g[0]=-2e9;
for(int s=0;s<(1<<m);s++)
{
g[c[s]]=max(g[c[s]],dp[i][j][s]+w[s]);
}
dp[i][j][0]=g[0],dp[i][j][1]=g[1];
}
}
}
ll ans=-9e18;
for(int i=0;i<(1<<m);i++)
{
ans=max(ans,dp[1][n][i]);
}
printf("%lld",ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律