WZRY

为了排位赛的Cjj神,最近耗尽气力来打WZRY。

Cjj神最近有N局预约的排位赛,其中第i局需要耗时Li的时间。因为浓浓的Gay情,Cjj神不能改变这些排位赛的的顺序。作为一个很有(mei)自制力的人,Cjj神计划用M+1天打完N局,为了能够活着见到第M+2天的太阳,他希望耗时最长的一天最短。

每天最少打一局。

请告诉他这个值是多少,以使他判断他是否能活下来;并且告诉他在总时长最长一天等于这个最小值的情况下有多少种方案,以使他判断他活下来的概率是多少。

输入格式

第一行两个整数N,M。

接下来N个整数Li。

输出格式

一行两个数,第一个是总时长最长的一天的最小值,第二个数是方案总数,对10,007取模。

数据范围

10%:N<=25

30%:N<=300

60%:N<=10000

100%:N<=50000,0<=m< n,m<1000,1<=Li<=1000

这道题有两问,第一问可以很简单地用二分+贪心解决。

但第二问呢?

首先这道题的普通暴力DP是很好想到的,设f[i][j]为第i天,打了j局比赛的方案总数。

很显然f[i][j]=∑f[i-1][k](sum[j]-sum[k]<=ans)

sum为Li的前缀和。

奉上暴力代码:

#include <bits/stdc++.h>
#define mod 10007
using namespace std;
inline char tc(){
static char fl[],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,,,stdin),A==B)?EOF:*A++;
}
inline int read(){
char c;
while(!isdigit(c=tc()));int x=c-'';
while(isdigit(c=tc()))x=x*+c-'';
return x;
}
int n,m,a[],mx,ans,ww,f[][],sum[];
int check(int x){
int tot=,last=x,d=;
for(int i=;i<=n;i++)
if(last>=a[i])last-=a[i];
else d++,last=x-a[i];
return d<=m;
}
int main(){
n=read(),m=read();m++;
for(int i=;i<=n;i++)a[i]=read(),mx=max(mx,a[i]),ww+=a[i],sum[i]=sum[i-]+a[i];
int L=mx,R=ww;
while(L<=R){
int mid=L+R>>;
if(check(mid))R=mid-,ans=mid;
else L=mid+;
}//二分,第一问
for(int i=;i<=m;i++){f[i-][]=;
for(int j=i;j<=n;j++){
for(int k=i-;k<j;k++)
if(sum[j]-sum[k]<=ans)
f[i][j]=(f[i][j]+f[i-][k])%mod;
}
}
int tot=;
for(int i=;i<=m;i++)tot=(tot+f[i][n])%mod;
printf("%d %d",ans,tot);
}

暴力

这个O(M*N^2)的效率一定会超时,所以我们要对暴力优化。

仔细看这个暴力,不难发现其实是一个不停枚举j和k边界的过程。

又想到我们知道最大耗时的最小值,那么就可以在已知k便边界的情况下通过预处理求出j边界的值。

设pre[i]表示第i局最远可以由哪一局转移过来。

那么只需枚举k加前缀和维护f数组的值就可以得到O(MN)的算法了。

但通过观察数据可得内存会炸,由于有前缀和维护,只需要每次i做完1次时将f清零即可。

code:

#include <bits/stdc++.h>
#define mod 10007
#define ll long long
using namespace std;
inline char tc(){
static char fl[],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,,,stdin),A==B)?EOF:*A++;
}
inline int read(){
char c;
while(!isdigit(c=tc()));int x=c-'';
while(isdigit(c=tc()))x=x*+c-'';
return x;
}
int n,m,a[],mx,ans,ww,f[];
int sum[],pre[],d[];
int check(int x){
int tot=,last=x,d=;
for(int i=;i<=n;i++)
if(last>=a[i])last-=a[i];
else d++,last=x-a[i];
return d<=m;
}
int main(){
n=read(),m=read();m++;
for(int i=;i<=n;i++)a[i]=read(),mx=max(mx,a[i]),ww+=a[i],sum[i]=sum[i-]+a[i];
int L=mx,R=ww;
while(L<=R){
int mid=L+R>>;
if(check(mid))R=mid-,ans=mid;
else L=mid+;
}
for(int i=;i<=n;i++){int sum=;
for(int j=i;j>;j--){
if(sum+a[j]<=ans)sum+=a[j];
else {pre[i]=j;break;}
}
}//预处理pre
for(int i=;i<=n;i++)d[i]=;
int tot=;
for(int i=;i<=m;i++){
for(int j=i;j<=n;j++){
if(pre[j]>)f[j]=(f[j]+d[j-]-d[pre[j]-])%mod;
else f[j]=(f[j]+d[j-])%mod;
}d[]=;
tot=(tot+f[n])%mod;
for(int j=;j<=n;j++)d[j]=(d[j-]+f[j])%mod,f[j]=;//维护,清零
}
tot=((tot+mod)%mod+mod)%mod;
printf("%d %d",ans,tot);
}

AC

王者荣耀_KEY的更多相关文章

  1. 王者荣耀是怎样炼成的(一)《王者荣耀》用什么开发,游戏入门,unity3D介绍

    在国内,如果你没有听说过<王者荣耀>,那你一定是古董级的人物了. <王者荣耀>(以下简称“农药”),专注于移动端(Android.IOS)的MOBA游戏.笔者看到这么火爆,就萌 ...

  2. CyclicBarrier的使用之王者荣耀打大龙

    最近一直整并发这块东西,顺便写点Java并发的例子,给大家做个分享,也强化下自己记忆,如果有什么错误或者不当的地方,欢迎大家斧正. LOL和王者荣耀的玩家很多,许多人应该都有打大龙的经历,话说前期大家 ...

  3. Unity 使用 陀螺仪 实现 《王者荣耀》 登入界面 背景动态效果

    在 <王者荣耀> 登入界面 左右上下晃动手机(有些手机不支持)可以看到背景在变化 我使用的是iPhone SE 效果如下: 对比两张图片的左下角 可以看到差异 至于为什么要这么做: 1.使 ...

  4. CNN网络介绍与实践:王者荣耀英雄图片识别

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者介绍:高成才,腾讯Android开发工程师,2016.4月校招加入腾讯,主要负责企鹅电竞推流SDK.企鹅电竞APP的功能开发和技术优化工作 ...

  5. 浅谈canvas绘画王者荣耀--雷达图

    背景: 一日晚上下班的我静静的靠在角落上听着歌,这时"滴!滴!"手机上传来一阵qq消息.原来我人在问王者荣耀的雷达图在页面上如何做出来的,有人回答用canvas绘画.那么问题来了, ...

  6. 用python的requests第三方模块抓取王者荣耀所有英雄的皮肤

    本文使用python的第三方模块requests爬取王者荣耀所有英雄的图片,并将图片按每个英雄为一个目录存入文件夹中,方便用作桌面壁纸 下面时具体的代码,已通过python3.6测试,可以成功运行: ...

  7. PYTHON-面向对象-练习-王者荣耀 对砍游戏

    # 王者荣耀 对砍游戏# 两个英雄可以对砍 如果血量小于等于0 就GG# 所需的对象# 英雄对象""" 亚瑟 属性 类型 血量 名称 技能 Q 跳起来给你一刀 伤害50 ...

  8. 王者荣耀里拿个王者有啥了不起,有胆就来挑战一下ApsaraCache源码

    王者荣耀大家估计都玩的很溜吧,撸完代码开一局,只要不遇到个猪队友,拿个鲁班后羿估计你们都能爆掉对手的塔吧.大神们打个排位赛拿个王者就和吃饭夹菜一样简单... But...你们玩过Redis和Memca ...

  9. Beta周第14次Scrum会议(11/23)【王者荣耀交流协会】

    一.小组信息 队名:王者荣耀交流协会 小组成员 队长:高远博 成员:王超,袁玥,任思佳,王磊,王玉玲,冉华 小组照片 二.开会信息 时间:2017/11/23 17:02~17:14,总计12min. ...

随机推荐

  1. 【javascript】异步编年史,从“纯回调”到Promise

    异步和分块——程序的分块执行   一开始学习javascript的时候, 我对异步的概念一脸懵逼, 因为当时百度了很多文章,但很多各种文章不负责任的把笼统的描述混杂在一起,让我对这个 JS中的重要概念 ...

  2. Java面向对象的理解

    Java是一门面向对象的编程语言(Object Oriented Programming,OOP), 这个句话是每个学习Java的程序员应该先深刻理解的一句话. 我们之所以将自自然界分解,组织成各种概 ...

  3. 记一次被yield return坑的历程。

    事情的经过是这样的: 我用C#写了一个很简单的一个通过迭代生成序列的函数. public static IEnumerable<T> Iterate<T>(this Func& ...

  4. 2017年9月3日 Spring及Mybatis中连接数据库的不同方式

    连接数据库用spring和mybatis中使用的方法可以不同,mybaits可以不用写数据库的配置文件 Spring的连接方法 <!-- 读取属性文件(.properties)的内容 --> ...

  5. HBuilder打包App方法

    HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开发IDE.该软件既可以支持web代码编写,也可以将已经编写好的项目代码打包为手机APP. HBuilder提供的打包有云端打 ...

  6. Ext.data.Store添加动态参数

    多条件查询页面的参数都是动态的,并且我们通常还会有默认加载页面.此时,动态添加参数非常重要,其中baseparam是解决问题的关键. @ 将查询条件定义为一个全局变量 var param_01 = & ...

  7. css控制竖直文字显示

    假如有一天,你把水平文字看腻味了...... 我建议你不妨试试垂直文字显示,就像这样: 我 是 竖 直 显 示 的 : 哈哈! 言归正传,怎么把一段话,垂直显示呢? 方法1: //把下面代码另存为ht ...

  8. zabbix上监控docker

    说明 第一种方案,借助docker的python版的api,然后通过自己封装自定义脚本来做,稍微麻烦点,但是可以达到个人自定义的效果. 第二种借助国外的一位大神已经封装好的模板来做,简单省事情,不过功 ...

  9. Maven maven-compiler-plugin版本

    项目执行Maven clean后出现WARNING提示.报如信息如下,根据报错信息 'build.plugins.plugin.version' for org.apache.maven.plugin ...

  10. Maven 中央仓库及阿里云仓库地址

    Maven 中央仓库地址: 1. http://www.sonatype.org/nexus/ 2. http://mvnrepository.com/ 3. http://repo1.maven.o ...