题面(加密)

不得不说这次的题除了引起单身汪极度不适之外还是出的很有水平的……

A.

很好的dp题

模型非常简单,如果数据范围足够友好的话就是一道dp入门题

30%:

我们可以设$dp[i][j]$为到第i天一共喂食给出了j块饼干的方案数

易得转移方程:$dp[i][j+k]=\sum \limits_{k=0}^{min(m-1,n-j)}{dp[i-1][j]}$,i枚举天数,j枚举已给出数量,k枚举下一步给出数量

$\sum \limits_{i=1}^{n}{dp[i][n]}$即为答案

但是i是要枚举到d的,我们的二维数组显然开不了这么大,所以我们可以得到30分的好成绩(滑稽

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=2005;
const ll mod=998244353;
int n,m;
ll dp[N][N],D;
void work()
{if(1LL*n>=1LL*m*D||m<=1){puts("0");return ;}memset(dp,0,sizeof(dp));for(int i=0;i<=min(m-1,n);i++)dp[1][i]=1;for(int i=2;i<=D;i++)for(int j=0;j<min(1LL*n,D*m);j++)for(int k=0;k<=min(m-1,n-j);k++)(dp[i][j+k]+=dp[i-1][j])%=mod;ll ans=0;for(int i=1;i<=D;i++)(ans+=dp[i][n])%=mod;cout<<ans%mod<<endl;
}
int main()
{while(1){scanf("%d%lld%d",&n,&D,&m);if(n==0&&D==0&&m==0)break;work();}return 0;
}

View Code

(另外,冲着30分去就按着30分范围打,不要梦想把数组开到极限还能多得分……事实上博主的30分就因为数组开太大 炸了内存 没了)

100%:

d的范围十分大,但我们不难发现真正给出饼干的天数最多只有n

所以可以把上面那个状态数组的定义稍作更改:真正给出饼干天数为i,给出饼干数量为j时的方案数

另外,为了进一步优化复杂度,使用前缀和优化,我们需要对枚举变量的意义作改动,让等号左侧为$dp[i][j]$

$dp[i][j]=\sum \limits_{k=j-m+1}^{j-1}{dp[i-1][k]}$

在统计结果时,对于每个$dp[i][n]$,是从d天中选任意i天给出饼干,所以还要乘上相应组合数

即:$ans=\sum {dp[i][n]*C_d^i}$

组合数直接根据相邻两项关系递推算即可 记得不能直接除 要乘逆元

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=2005;
typedef long long ll;
const ll mod=998244353;
ll dp[N][N],n,d,m,fac[N],C[N],sum[N];
ll qpow(ll a,ll b)
{ll res=1;while(b){if(b&1)res=res*a%mod;a=a*a%mod;b>>=1;}//if(res<0)cout<<"Jackpot!"<<endl;return res;
}
ll inv(ll x)
{return qpow(x,mod-2);
}
void work()
{if(n>=m*d||m<=1){puts("0");return ;}memset(dp,0,sizeof(dp));memset(sum,0,sizeof(sum));C[0]=1;for(int i=1;i<=min(n,d);i++){C[i]=(C[i-1]*(1LL*(d-i+1)%mod))%mod*inv(i)%mod;
/*        if(C[i]<0)while(1);cout<<"***"<<C[i]<<endl;*/}for(int i=1;i<m;i++)dp[1][i]=1,(sum[i]=sum[i-1]+dp[1][i])%=mod;for(int i=m;i<=n;i++)sum[i]=sum[i-1];for(int i=2;i<=n;i++){for(int j=1;j<=n;j++)dp[i][j]=(sum[j-1]-sum[max(0LL,j-m)]+mod)%mod;//    sum[0]=0;for(int j=1;j<=n;j++)(sum[j]=sum[j-1]+dp[i][j])%=mod;}ll ans=0;for(int i=1;i<=min(d,n);i++)(ans+=dp[i][n]*C[i]%mod)%=mod;cout<<ans<<endl;}
int main()
{while(1){scanf("%lld%lld%lld",&n,&d,&m);if(!n&&!d&&!m)break;work();}return 0;
}

View Code

B.

数据很水,水到直接把这道题变成了最短路的板子……

枚举与1节点相连的点,对于每个点,把1和他们之间的边临时断开后跑最短路

用$dis[1]+len[i]$更新ans即可

正解似乎是什么二进制分组blablabla  我也不会啊

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define pa pair<int,int>
using namespace std;
const int N=10005,M=40005;
int n,m,T;
int to[M<<1],dis[N],vis[N],nxt[M<<1],tot,head[N],del[M<<1],len[M<<1];
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
void add(int x,int y,int z)
{to[++tot]=y;len[tot]=z;nxt[tot]=head[x];head[x]=tot;
}
void dj(int s)
{memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));priority_queue<pa> q;dis[s]=0;//vis[s]=1;q.push(make_pair(0,s));while(!q.empty()){int x=q.top().second;q.pop();if(vis[x])continue;vis[x]=1;for(int i=head[x];i;i=nxt[i]){if(del[i])continue;int y=to[i];if(dis[y]>dis[x]+len[i]){dis[y]=dis[x]+len[i];q.push(make_pair(-dis[y],y));}}}/*for(int i=1;i<=n;i++)cout<<dis[i]<<' ';puts(" ");*/
}
void ini()
{for(int i=1;i<=n;i++)head[i]=0;for(int i=1;i<=m*2;i++)to[i]=nxt[i]=del[i]=len[i]=0;tot=1;
}
void work()
{n=read();m=read();ini();for(int i=1;i<=m;i++){int x=read(),y=read(),z=read();add(x,y,z);add(y,x,z);}int ans=0x3f3f3f3f;;for(int i=head[1];i;i=nxt[i]){int y=to[i];del[i]=del[i^1]=1;dj(y);del[i]=del[i^1]=0;ans=min(ans,dis[1]+len[i]);}cout<<(ans==0x3f3f3f3f?-1:ans)<<endl;return ;
}
int main()
{T=read();while(T--)work();return 0;
}

View Code

转载于:https://www.cnblogs.com/Rorschach-XR/p/11219398.html

[7.19NOIP模拟测试6]失恋三连(雾 题解相关推荐

  1. [NOIP模拟测试10]辣鸡(ljh) 题解

    首先计算块内贡献,很显然是$(x_2-x_1)*(y_2-y_1)*2$. 然后考虑矩形之间的贡献,sort一遍分类讨论$n^2$暴力即可. 注意考虑边界情况是否能多两个,以及角对角的情况. 另外,排 ...

  2. csp-s模拟测试54 - 55

    两天炸掉了135分 csp-s模拟测试54 期望得分:100+72+45 实际得分:100+21+31 T2有重边,关于邻接矩阵,它死了TAT,挂了记忆化搜索-39. 然后判c=0想到了1点没度,然而 ...

  3. 2018冬令营模拟测试赛(十八)

    2018冬令营模拟测试赛(十八) [Problem A]Table 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述&qu ...

  4. 2018冬令营模拟测试赛(九)

    2018冬令营模拟测试赛(九) [Problem A]王子 试题描述 不是所有王子都会遇见自己的中关村,主公,公主. 从前有个王子姓王,王王子遇到了一位美丽的公主,她的名字当然是公公主啦. 王王子对公 ...

  5. Mockito:一个强大的用于Java开发的模拟测试框架

    介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用Mockito的Java示例. 模拟(Mock)的概念 在软件开发的世界之外, "mock"一 ...

  6. WebRTC通话质量调优:三个弱网模拟测试工具的使用与对比

    作为一个使用 WebRTC 独立开发者或团队,怎样才能知道自己 App 的通话质量已经"达标"了呢?如何进行合理的弱网模拟测试?介绍给开发者们三个开源工具的部署.使用方法,及其各自 ...

  7. NOIP模拟测试19「count·dinner·chess」

    反思: 我考得最炸的一次 怎么说呢?简单的两个题0分,稍难(我还不敢说难,肯定又有人喷我)42分 前10分钟看T1,不会,觉得不可做,完全不可做,把它跳了 最后10分钟看T1,发现一个有点用的性质,仍 ...

  8. 测试http请求的Chrome插件:Postman插件的查找安装模拟测试 - 讲解篇

    一个测试http请求的Chrome插件:Postman 本文简述一下这个Chrome插件:Postman插件的查找.下载.安装. 这里需要合法的VPN服务商,具体原因你懂的. Chrome资源查找下载 ...

  9. php代码练习,PHP模拟测试练习

    PHP模拟测试练习 宝剑不磨要生锈;人不学习要落后.以下是小编为大家搜索整理的PHP模拟测试练习,希望能给大家带来帮助!更多精彩内容请及时关注我们应届毕业生考试网! 一.单项选择题 1.下列哪些是PH ...

最新文章

  1. 用30行代码做一个微信智障机器人
  2. springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题
  3. oracle+查表物理块数,查询Oracle表实际物理使用大小
  4. SSL的4阶段握手过程
  5. 04_使用域名访问后台管理系统(Nginx)
  6. 完全卸载VS2015_enterprise
  7. 2022考研【王道计算机408】【天勤计算机408】数据结构+操作系统+计算机组成原理+计算机网络
  8. 标志寄存器(PSW)
  9. 我的世界 Unity3D MineCraft 用Unity3D制作类似MineCraft我的世界的游戏 洞穴算是完成了
  10. TSOJ 好好做题(屑)——递推状态压缩+高精度
  11. linux的系统监视器图片_用Nvidia Jetson Nano 2GB和Python构建一个价值60美元的人脸识别系统 - 人工智能遇见磐创...
  12. 【考研政治】2021肖八整理(时政部分)
  13. ios 判断数字开头_iOS 正则表达式判断纯数字及匹配11位手机号码的方法
  14. 你知道怎么用Pandas绘制带交互的可视化图表吗?
  15. 编程小白和大神都想要的百元级物理外挂(装逼利器)----KeyPad++编程键盘
  16. 全国大学高校基础信息 API 接口
  17. Win11没有应用商店怎么办?Win11没有应用商店的解决方法
  18. 蓝桥冲刺31天打卡—Day10
  19. 从网页中唤起桌面应用程序
  20. 个人电脑日常必备软件推荐,无广告、好用、持续更新

热门文章

  1. ROS中使用protoBuf通信
  2. 小程序marker callout 遇到的坑
  3. JPBC密码学库封装函数
  4. Notepad++插件: HexEditor
  5. 星际2中复刻DOTA白虎
  6. php邮件回复功能,用PHP回复邮件(Laravel Mailgun)
  7. JDBC读取Oracle的US7ASCII编码中文乱码及不同编码下汉字占用字节的问题
  8. 调用tel://打电话
  9. 什么是SSD TRIM (by quqi99)
  10. 一根均线选股法_一根均线选股法视频教程