CODEVS-新斯诺克
原题地址:新斯诺克
斯诺克又称英式台球,是一种流行的台球运动。在球桌上,台面四角以及两长边中心位置各有一个球洞,使用的球分别为1 个白球,15 个红球和6 个彩球(黄、绿、棕、蓝、粉红、黑)共22个球。
击球顺序为一个红球、一个彩球直到红球全部落袋,然后以黄、绿、棕、蓝、粉红、黑的顺序逐个击球,最后以得分高者为胜。斯诺克的魅力还在于可以打防守球,可以制造一些障碍球使对方无法击打目标球而被扣分。正是因为这样,斯诺克是一项充满神奇的运动。
现在考虑这样一种新斯诺克,设母球(母球即是白球,用于击打其他球)的标号为M,台面上有N 个红球排成一排,每一个红球都有一个标号,他们的标号代表了他们的分数。
现在用母球击打这些红球,一杆击打,如果母球接触到红球,就称为“K 到红球”。我们假设,一次可以击打任意多相邻连续的红球,也可以只击打一个球。并且红球既不会落袋,也不会相互发生碰撞,而只是停留在原处。每次击打时候,要想“K 到红球”,至少要击打一个红球,如果想一次击打多个红球,那么击打的红球必须是依次连续排列的。如果一次“K 到红球”所有红球的标号之和的平均数大于母球的标号M,就获得了一个“连击”。
现在请你计算总共能有多少种“连击”方案。
注意:如果当前有标号为1、2、3 的三种红球,母球标号为0,有如下6 种获得“连击”方案:( 1)、( 2)、( 3)、( 1,2)、( 2,3)、( 1,2,3)
共有两行。
第一行是N,M (N<=100000,M<=10000) ,N 表示台面上一共有N 个红球,M 表示母球的标号。
第二行是N 个正整数,依次表示台面上N 个红球的标号,所有标号均不超过10000。
只有一个数,为“连击”的方案总数。
4 3
3 7 2 4
7
输出情况:
(7),(2),(4),(3,7),(3,4),(3,7,2),(3,2,4),(3,7,2,4)
解题思路:
首先,此题抽象来看是想从一组数中找出所有的顺序对,且顺序对的平均数大于某一个数,统计有多少个这样的数。按照这个思路想到的是分治法中的归并排序思想,不过我先对这题做些化简,把所有红球的标号减去母球的标号,之后我只需要看是否大于0即可知道是否满足条件,还有一个地方注意一下,标号可以是负数,所以用一个read()函数进行处理,数组下标从1开始,其他下标值先置为0,方便之后比较,接着再将数组进行前缀和运算(数组a[ i ] = 当前数 - 母球数 + a[ i - 1 ]) ,记住数组是从1开始存的,得出的数组通过归并排序函数中比较一下并统计顺序对即可算出最终个数。
代码如下:
#include<cstdio>
#include<iostream>
using namespace std; int n, m, a[], b[];
long long ans; int read() {
//x是计算位数用的,f是判断正负号
int x = , f = ; char ch = getchar();
while (ch<'' || ch>'')
{
if (ch == '-')
f = -;
ch = getchar();
}
while (ch >= ''&&ch <= '')
{
x = x * + ch - '';
ch = getchar();
}
return x * f;
} void Merge_sort(int l, int r) {
if (l >= r)
return;
int mid = (l + r) / ;
Merge_sort(l, mid);
Merge_sort(mid + , r);
int i = l, j = mid + , k = l;
while (i <= mid && j <= r) {
if (a[i] < a[j])
{
b[k++] = a[i++];
ans += r - j + ;//统计顺序对,(r-j+1)算出的结果就是当前条件下的顺序对
}
else b[k++] = a[j++];
}
while (i <= mid)
b[k++] = a[i++];
while (j <= r)
b[k++] = a[j++];
for (int w = l; w <= r; w++)
a[w] = b[w];
} int main() {
n = read(); m = read();
for (int i = ; i <= n; i++) {
a[i] = read() - m + a[i - ];//求前缀和
}
Merge_sort(, n);
cout << ans << endl;
return ;
}
可能我的描述还不清楚,可以结合代码自己演算或者调试一下,要先理解题目的要求和了解归并排序和前缀和的思想,不然会比较吃力,当然还有其他算法(听说树状数组可以做,暂时不会( ̄_ ̄|||))可以解决此题,大家可以借鉴我的做法
CODEVS-新斯诺克的更多相关文章
- codevs 3324 新斯诺克
3324 新斯诺克 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 白银 Silver 题目描述 Description 斯诺克又称英式台球,是一种流行的台球运动.在球桌上, ...
- Codevs3324 新斯诺克
题目描述 Description 斯诺克又称英式台球,是一种流行的台球运动.在球桌上,台面四角以及两长边中心位置各有一个球洞,使用的球分别为1 个白球,15 个红球和6 个彩球(黄.绿.棕.蓝.粉红. ...
- 【u249】新斯诺克
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 斯诺克又称英式台球,是一种流行的台球运动.在球桌上,台面四角以及两长边中心位置各有一个球洞,使用的球分 ...
- 斯诺克台球比赛规则 (Snooker)
斯诺克台球比赛规则 斯诺克(Snooker)的意思是“阻碍.障碍”,所以斯诺克台球有时也被称为障碍台球.此项运动使用的球桌长约3569毫米.宽1778毫米,台面四角以及两长边中心位置各有一个球洞,使用 ...
- Java版斯诺克开源分享
Java版斯诺克开源分享 这个小程序是我平时无聊写着玩的,在网盘里躺了好久了,今天就把它拿出来跟大家分享一下,下面是游戏截图: 请不要吐槽这个界面,斯诺克的球台是我从qq游戏里面截取的... 下面是源 ...
- P2645 斯诺克 题解
P2645 斯诺克 题目背景 镇海中学开设了很多校本选修课程,有体育类.音乐类.美术类.无线电测向.航空航海航天模型制作等,力争使每位学生高中毕业后,能学到一门拿得出手的兴趣爱好,为将来的终身发展打下 ...
- 用HTML 5打造斯诺克桌球俱乐部(1) – 51CTO.COM
本文介绍了如何利用HTML5技术来打造一款非常酷的斯诺克桌球游戏,文章中详细地列… 查阅全文 ›
- 洛谷 题解 P2645 【斯诺克】
吐槽一下这道题: 数据太水了!!! 请注意,这题如果你考虑了犯规的情况,那么你的分数...可能会和我一样,只有40分. 也就是说,这是一篇AC不了这道题的题解!!! 现在,我来讲一下这道题的正解: 两 ...
- OI 刷题记录——每周更新
每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...
随机推荐
- intval()
1.将字符串转换成整数 2.取数字的整数部分
- macOS 10.13 安装Virtualbox失败
macOS 10.13 安装Virtualbox失败 Enviroment macOS: 10.13 High Sierra virtualBox: 5.1.28 Problem descriptio ...
- 文件打包代码更新 使用json记录打包文件信息
经过之前的几次试验 决定使用json记录打包文件信息 #include "Package.h" #include "json/json.h" #include ...
- spring property标签中的 ref属性和ref 标签有什么不同? 如下:<property name="a" ref="b" />
spring property标签中的 ref属性和ref 标签有什么不同? 如下:<property name="a" ref="b" /> sp ...
- ASIHTTPRequest-Cookie的使用[转]
ASIHTTPRequest允许你使用全局存储来和所有使用CFNetwork或者NSURLRequest接口的程序共享cookie. 如果设置useCookiePersistence为YES(默认值) ...
- git 上传项目
参考:https://blog.csdn.net/qq_28304687/article/details/69959238?fps=1&locationNum=8 第一部分 初次上传 1.先在 ...
- SqlLocalDB 的一些常用命令行
Once installed, you can interact with SqlLocalDb using the command line. The following will tell you ...
- 两种步骤 更改 EBS R12界面LOGO以及内容
from:metalink more: Note 174219.1 - How To Change The Logo In The Oracle Application Menu Note 84975 ...
- ASP.NET Core2使用Autofac实现IOC依赖注入竟然能如此的优雅简便
初识ASP.NET Core的小伙伴一定会发现,其几乎所有的项目依赖都是通过依赖注入方式进行链式串通的.这是因为其使用了依赖注入 (DI) 的软件设计模式,代码的设计是遵循着“高内聚.低耦合”的原则, ...
- Lucene索引的【增、删、改、查】
前言 搞检索的,应该多少都会了解Lucene一些,它开源而且简单上手,官方API足够编写些小DEMO.并且根据倒排索引,实现快速检索.本文就简单的实现增量添加索引,删除索引,通过关键字查询,以及更新索 ...