那一天我们许下约定

内部题,题干不粘了。

$30分算法$


首先看数据范围,可以写出来一个普通dp

#include<bits/stdc++.h>
#define ll int
#define A 2100
#define mod 998244353
using namespace std;
ll f[1501][A+A+A],n,d,m;
int main()
{scanf("%d%d%d",&n,&d,&m);while(n!=0&&d!=0&&m!=0){memset(f,0,sizeof(f));f[0][0]=1;for(ll i=1;i<=d;i++)f[0][i]=1;for(ll i=1;i<=n;i++)for(ll k=1;k<=d;k++){for(ll j=min(m-1,i);j>=0;j--)if(i-j>=0)    f[i][k]=(f[i][k]+f[i-j][k-1])%mod;}printf("%d\n",f[n][d]);scanf("%d%d%d",&n,&d,&m);}
}

View Code

d最大为$1e^12$所以你这个dp会完美T掉或者M掉

$100分算法$


观察,发现n的范围非常小,m的范围也特别小。

所以我们利用这条性质,先片面的忽视掉这一天不给她饼干的情况,我们设定$f$定义为每天都给她饼干的情况。

设$f[i][j]$中i表示为前$i$天目前给了$j$个饼干的情况

然后可以推出来方程式

可以给她1~m-1个饼干

$f[i][j]=\sum_\limits {k=(j-M-1)}^{k<=j-1} f[i-1][k]$

然后直接转移,复杂度仍然难以接受,观察dp式子发现它是由一个字段转移过来的,我们要用前缀和维护优化一下。

仍然AC不了?

可能你会乘爆long long

注意多取模

#include<bits/stdc++.h>
#define ll long long
#define  A 2010
#define mod 998244353
using namespace std;
ll f[A][A],n,m,q,d;
ll sum[A];
ll meng(ll x,ll k)
{ll ans=1;for(;k;k>>=1,x=x*x%mod)if(k&1)ans=x*ans%mod;return ans%mod;
}
int main(){while(1){scanf("%lld%lld%lld",&n,&d,&m);ll ans=0;if(n==0&&d==0&&m==0){return 0;}memset(f[1],0,sizeof(f[1]));f[0][0]=1;for(ll i=1;i<=min(n,m-1);i++)f[1][i]=1;for(ll i=2;i<=n;i++){for(ll j=0;j<=n;j++)sum[j]=(sum[j-1]%mod+f[i-1][j]%mod)%mod;for(ll j=1;j<=n;j++)f[i][j]=(sum[j-1]%mod-sum[max(j-m,0ll)]%mod+mod)%mod;}ll sd=d%mod;for(ll i=1;i<=min(n,d);i++){if(i==1)ans=(ans+sd*f[i][n]%mod)%mod,ans%=mod;else{sd=(sd%mod*meng(i,mod-2)%mod*((d-i+1)%mod))%mod;ans%=mod;ans=(ans+f[i][n]%mod*sd%mod)%mod;}
//                if(sd!=0)printf("sd=%lld ans=%lld f*s=%lld\n",sd,ans,f[i][n]*sd%mod);
        } cout<<(ans+mod)%mod<<endl;}
}

View Code

那一天她离我而去

听说暴力可以AC所以我打的A*???

看不懂题解,如果给一个菊花图题解不就爆炸了吗?$2^{10000}$我觉得会炸

所以这个题瞎搞就行了???

然后我就瞎搞了个A*

跑的还特别快。大约600毫。

思路大约就是把每个直接与1相连的点拿出来,然后对于每个点跑A*,因为已经提前处理出来各种dis所以比较快。

然后没了

#include<bits/stdc++.h>
using namespace std;
#define ll int
#define A 100010
#define in inline
ll n,m;
bool flag[A],ok=0;
ll head[A],nxt[A],ver[A],tot1=0,t;
ll head2[A],nxt2[A],ver2[A],cnt=0,tot2=0;
ll value[A],value2[A],e,d[A],len=0;
struct qnode{ll v,w,sz,id;friend bool operator < (qnode x,qnode y){return x.w+d[x.v]>y.w+d[y.v];}
};
void re()
{tot1=1,tot2=1;memset(flag,0,sizeof(flag));memset(head,0,sizeof(head));memset(head2,0,sizeof(head2));memset(ver,0,sizeof(ver));memset(ver2,0,sizeof(ver2));memset(nxt,0,sizeof(nxt));memset(nxt2,0,sizeof(nxt2));memset(value,0,sizeof(value));memset(value2,0,sizeof(value2));
}
in void add1(ll u,ll v,ll w)
{ver[++tot1]=v;nxt[tot1]=head[u];value[tot1]=w;head[u]=tot1;
}
in void add2(ll x,ll y,ll w)
{ver2[++tot2]=y;nxt2[tot2]=head2[x];value2[tot2]=w;head2[x]=tot2;
}
in void spfa(ll root)
{memset(flag,0,sizeof(flag));memset(d,0x3f,sizeof(d));queue <ll>q;q.push(root);flag[root]=1;d[root]=0;while(!q.empty()){ll x=q.front();q.pop();flag[x]=0;for(ll i=head[x];i;i=nxt[i]){ll y=ver[i],w=value[i];if(d[y]>d[x]+w){d[y]=d[x]+w;if(!flag[y]){flag[y]=1;q.push(y);}}}}return ;
}
in ll read()
{ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}return x*f;
}
in ll astar()
{
//    从每个直接相连的点开始跑A*ll ans=0x7ffffff;for(ll i=head[1];i;i=nxt[i]){ll y=ver[i];priority_queue<qnode> h;memset(flag,0,sizeof(flag));    qnode s;s.v=y,s.w=value[i],s.id=0;h.push(s);bool ok=0;while(!h.empty()){qnode no=h.top();
//            printf("当前 %d sumvalue=%d\n",no.v,no.w);if(no.v==1){ans=min(no.w,ans);break;}h.pop();flag[no.v]=1;for(ll i=head2[no.v];i;i=nxt2[i]){ll tu=ver2[i];
//                printf("tu=%d\n",tu);if(tu==1&&!ok){ok=1;
//                    printf("tu=%d \n",tu);continue;}if(flag[tu]){/*printf("掠过\n");*/continue;}
//                printf("没有掠过\n");
                qnode t;t.v=tu;t.w=value[i]+no.w;t.sz=no.sz+1;h.push(t);
//                printf("推入 %d->%d z=%d\n",no.v,tu,value2[i]+no.w);
            }}}return ans;
}int main()
{scanf("%d",&t);while(t--){re();ll xx,yy;ll zz;n=read(),m=read();for(ll i=1;i<=m;i++){xx=read(),yy=read();zz=read();add1(yy,xx,zz);add1(xx,yy,zz);add2(xx,yy,zz);add2(yy,xx,zz);}spfa(1);
/*        for(ll i=2;i<=tot1;i++){printf("%d\n",ver[i]);}for(ll i=1;i<=n;i++){printf("%d\n",d[i]);}
*/        ok=1;ll ans=astar();if(ans>=1000000) cout<<-1<<endl;elseprintf("%d\n",ans);}
}

View Code

转载于:https://www.cnblogs.com/znsbc-13/p/11218768.html

NOIP模拟测试6「那一天我们许下约定(背包dp)·那一天她离我而去」相关推荐

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

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

  2. NOIP模拟测试30「return·one·magic」

    magic 题解 首先原式指数肯定会爆$long$ $long$ 首先根据欧拉定理我们可以将原式换成$N^{\sum\limits_{i=1}^{i<=N} [gcd(i,N)==1] C_{G ...

  3. NOIP模拟测试21「折纸·不等式」

    折纸 题解 考试时无限接近正解,然而最终也只是接近而已了 考虑模拟会爆炸,拿手折纸条试一试,很简单 考你动手能力 代码 #include<bits/stdc++.h> using name ...

  4. NOIP模拟测试18「引子·可爱宝贝精灵·相互再归的鹅妈妈」

    待补 引子 题解 大模拟,注意细节 代码1 #include<bits/stdc++.h> using namespace std; int n,m;char a[1005][1005]; ...

  5. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  6. NOIP模拟测试38「金·斯诺·赤」

    金 辗转相减见祖宗 高精 #include<bits/stdc++.h> using namespace std; #define A 2000 #define P 1 #define N ...

  7. NOIP模拟测试34「次芝麻·呵呵呵·长寿花」

    次芝麻 题解 大力打表,发现快速幂, 例如初始$5$ $6$,那么第一次就是$5*2\%11=10$,$6*2\%11=1$. 代码 #include<bits/stdc++.h> usi ...

  8. NOIP模拟测试28「阴阳·虎·山洞」

    写这几个题解我觉得我就像在按照官方题解抄一样 阴阳 题解 将题目中给的阴阳看作黑色和白色 首先我们观察到最后生成图中某种颜色必须是竖着单调递增或竖着单调递减 类似这样 否则不满足这个条件 但合法染色方 ...

  9. NOIP模拟测试29「爬山·学数数·七十和十七」

    爬山题解不想写了 学数数 离散化然后找到以每一个值为最大值的连续子段有多少个,然后开个桶维护 那么怎么找以每一个值为最大值的连续子段个数 方法1(我的极笨的方法) 考试时我的丑陋思路, 定义极左值为左 ...

最新文章

  1. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶 1
  2. 网易云音乐Android版使用的开源组件
  3. 我命由我不由天,5个月逆袭百度,头条AI岗位,来挑战吗?
  4. dedecms调用当前栏目的子栏目怎么操作
  5. Python爬虫开发:requests库的使用--ip代理参数的设置
  6. R3Injector实例里的records map的填充逻辑
  7. P2782 友好城市
  8. 移动、复制、新增工作表
  9. 如何操作反射中构造方法、属性和普通方法?
  10. Linux 与 Windows 计算文件夹大小
  11. 使用FileZilla搭建简单的FTP
  12. 方正科技与鸿蒙os系统,国产手机系统的崛起——浅谈鸿蒙OS
  13. 在openSUSE-Leap-15.4-DVD-x86_64中使用佳能喷墨打印机ip2780
  14. Footprint:一夜暴涨250%的Boba,能否成为下个Layer 2代表
  15. 程序员的密码管理之道
  16. 抓取全网财经新闻,计算新闻相关股票的多空舆情,量化买入
  17. 磁盘被写保护怎么办?5个方案解除它
  18. android 命名空间的使用
  19. Glove 细节介绍
  20. (旧)2- 大家一起学:Flask构建弹幕微电影网站-前端首页搭建-0

热门文章

  1. xshell调出oracle安装界面,XShell+Xmanager实现在XShell中显示远程服务器的图形界面
  2. opc调试软件_组态王和三菱OPC软件完美演绎天塔之光
  3. Mobaxterm常用的指令(基于linux)
  4. linux查询设备文件信息失败怎么办,Linux下使用blkid命令查询设备及文件系统信息的方法...
  5. Java变长数组笛卡尔积_Java 8中的流作为流的笛卡尔积(仅使用流)
  6. 加白名单_Android保活从入门到放弃:乖乖引导用户加白名单吧
  7. C语言结构体使用与指针的理解
  8. php伪静态后不能访问html,php伪静态后html不能访问怎么办
  9. linux下的遥控器软件下载,Linux操作系统下遥控器的配置及使用方法
  10. unsafehelper java_Java 9中将移除 Sun.misc.Unsafe