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. poj 2492 a bug's life 简单带权并查集

    题意大致为找同性恋的虫子.... 这个比食物链要简单些.思路完全一致,利用取余操作实现关系之间的递推. 个人感觉利用向量,模和投影可能可以实现具有更加复杂关系的并查集. #include<ios ...

  2. xamarin.android 绑定百度地图SDK遇到的问题

    在 xamarin.android 绑定项目中,绑定 百度地图的LBS地图SDK,参考 https://developer.xamarin.com/guides/android/advanced_to ...

  3. selenium之handle学习 多窗口、句柄

    我们拿松勤软件测试的网站做例子: 直接获取all_handle这个list数据里面第二个handle的值:all_handle[1] # coding:utf-8 from selenium impo ...

  4. django富文本编辑器

    -------------------tinymce富文本编辑器1.下载安装 1.在网站pypi网站搜索并下载"django-tinymce-2.4.0" 2.解压:tar zxv ...

  5. JAVA实用案例之文件导入导出(POI方式)

    1.介绍 java实现文件的导入导出数据库,目前在大部分系统中是比较常见的功能了,今天写个小demo来理解其原理,没接触过的同学也可以看看参考下. 目前我所接触过的导入导出技术主要有POI和iRepo ...

  6. Java类加载原理解析

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt229 2       Java虚拟机类加载器结构简述 2.1    JVM三 ...

  7. Project 9:两种简单数列排序

    1.冒泡法排序 /* 冒泡排序法的核心思想就是依次把最大的数换到最后面. 若有n个数 就需要通过n-1次循环来排序. 具体做法就是从第一个数开始 两个数比较大小大的换到后面,这样最大的就在最后了. 然 ...

  8. 那些年,我们不懂的却又不得不提的 JAVA异常和异常处理!

    ---恢复内容开始--- 首先,我是个小小的菜鸟,最近突然突发奇想,想研究一下java的异常和异常的处理,稍有些理解,老鸟们莫要嘲笑... 既然要讲异常和异常的处理,我们就要先了解异常,那么,什么是异 ...

  9. jQuery插件——ajax

    一.ajax请求 1.load(url, [data], [callback]) 概述:加载远程的HTML文件代码,并插入到指定的DOM节点中. 参数:url:待装入 HTML 网页网址. data: ...

  10. HTTP请求响应机制与响应状态码

    转载来源:http://blog.csdn.net/xyw591238/article/details/51907143 HTTP协议 Internate的基本协议是TCP/IP(传输控制协议和网际协 ...