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同余 ...
随机推荐
- C语言日志处理
一.简介 zlog是一个高可靠性.高性能.线程安全.灵活.概念清晰的纯C日志函数库,在效率.功能.安全性上大大超过了log4c,并且是用c写成的,具有比较好的通用性. 二.安装 下载 https:// ...
- Determining Whether Multitasking Is Available
[Determining Whether Multitasking Is Available] Apps must be prepared to handle situations where mul ...
- C程序设计语言(2)文摘
第一章 导言 1.1 入门 1.2 变量与算术表达式 1.3 for语句 1.4 符号常量 1.5 字符输入输出 #include "stdafx.h" main(int argc ...
- Google Tango SDK下载
Tango SDK files谷歌Tango开发包 The Tango SDK is under active development; please keep this in mind as you ...
- [Selenium With C#基础教程] Lesson-02 Web元素定位
作者:Surpassme 来源:http://www.jianshu.com/p/cfd4ed1daabd 声明:本文为原创文章,如需转载请在文章页面明显位置给出原文链接,谢谢. 使用Selenium ...
- Register A Callback To Handle SQLITE_BUSY Errors(译)
http://www.sqlite.org/c3ref/busy_handler.html留着自己看的. Register A Callback To Handle SQLITE_BUSY Error ...
- HRBUST1313 火影忍者之~静音 2017-03-06 16:11 39人阅读 评论(0) 收藏
火影忍者之-静音 传说中的火之国一年一度的公务员选拔又开始了!木叶忍者村此次也要从中选拔出5人来,作为即将上任的新火影纲手的小弟-,可是报考公务员的人数实在是太--多啦!所以纲手的贴身随从-静音小姐, ...
- 微信小程序Wepy框架的三个事件交互($broadcast,$emit,$invoke)
$broadcast: $broadcast事件是由父组件发起,所有子组件都会收到此广播事件,除非事件被手动取消.事件广播的顺序为广度优先搜索顺序,如上图,如果页面Page_Index发起一个$bro ...
- 寻找最大的K个数(下)
接着昨天的写,里面的代码包含昨天的 #include <iostream> using namespace std; #define N 50 //初始化数组 , , , , , , , ...
- ZOJ3708:Density of Power Network
The vast power system is the most complicated man-made system and the greatest engineering innovatio ...