CSU1654: 收集金币

Description

有一条路上有一排的金币,如果把这条路看做一个数轴,那么在1~n的位置上各有一个金币,共n个,每个金币有一个不同的编号1~n(不一定按顺序).在0位置上有一个人,他有很多神奇的小车,他可以在0位置释放神奇的小车,每个小车一旦被释放就会沿着数轴正方向每个单位时间走一个单位距离.如果一个小车所在的位置有金币且这个金币的编号是剩余金币中编号最小的,而且如果收集了这个金币能保证这个小车收集到的金币编号是连续的,那么这个小车就会收集这个金币.神奇小车一旦走到n+1的位置就能把这个车上的金币转化为价值,如果这个车上有x个金币,就能转化出x*x单位的价值.在路上可能同时存在多个小车.</br>如果A小车和B小车都在路上,且A车位置有编号m的金币,B车位置有编号m+1的金币,m是剩余金币中最小的编号,这样A车可以收集m号金币,B车也可以收集m+1号金币.

Input

多个样例,每个样例占两行.第一行一个整数n(1 <= n <= 100000),之后一行n个整数,为1~n的一个排列.

Output

每行输出一个样例的结果,包括两个整数v和t,用空格隔开.

v表示那个人能转化出的最大价值.

t表示转化v价值要花的最少的时间.

Sample Input

5
3 4 1 2 5

Sample Output

13 9

HINT

第一个样例:在0时间释放第一个小车,3时间释放第二个小车,第二个小车在9时间到达6位置结束.第一个小车收集了1,2号金币,转化4个价值,第二个小车转化了9个价值.

Source

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;

#define LS 2*i
#define RS 2*i+1
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define N 20005
#define MOD 1000000007
#define INF 0x3f3f3f3f
#define EXP 1e-8

int n,a[100005],hsh[100005];
int v,t,s,x;

int main()
{
    int i,j,k;
    W(~scanf("%d",&n))
    {
        UP(i,1,n)
        {
            scanf("%d",&a[i]);
            hsh[a[i]] = i;
        }
        s = 1;
        v = t = 0;
        W(s<=n)
        {
            int cnt = 1;
            W(hsh[s+1]>hsh[s])
            {
                s++;
                cnt++;
            }
            v+=cnt*cnt;
            t+=hsh[s];
            s++;
        }
        printf("%d %d\n",v,t);
    }

    return 0;
}
时间: 2024-12-30 13:22:07

CSU1654: 收集金币的相关文章

codecombat之边远地区的森林31-44关代码分享

codecombat中国游戏网址: http://www.codecombat.cn/ 所有代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 31.为援兵坚持住 // 食人魔正在爬悬崖 // 为集结民兵组织保护足够长时间的农民. loop { var flag = this.findFlag(); var enemy = this.findNearestEnemy(); if (flag) { // 捡旗子 this.pickUpFla

codecombat之边远地区的森林23-30关及地牢40\41关代码分享

codecombat中国游戏网址: http://www.codecombat.cn/ 所有代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 23.Agrippa防守 loop { var enemy = this.findNearestEnemy(); if(enemy) { // 用 distanceTo 获取与敌人的距离. var distance = this.distanceTo(enemy); // 如果距离小于5米...

个人日志5(7.1-7.3)

姓名 于博文 时间 2016年7月1日-7月3日 星期五-星期日 学习内容 将之前做的服务器和数据库功能完善. 加入了金币系统,用户在使用本程序时可以收集金币,金币保存在本地的数据库中.它可以用来购买各种商品,可以使游戏更有意思. 现有的道具分为4种:无敌.减速.双倍金币和复活.这些功能将在日后实现. 设计排行榜界面,将前几名的成绩美观的显示. 所遇问题 解决方案

codecombat安息之云山峰1-10关及森林47/48关代码分享

codecombat中国游戏网址: http://www.codecombat.cn/ 所有代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1.峭壁追逐 // 抓住 Pender Spellbane 去了解她的秘密. loop { // Pender是这里唯一的朋友,所以她总是在最近的位置. pender = this.findNearest(this.findFriends()); if (pender) { // moveXY()

codecombat之Sarven沙漠13-24关及森林45/46关代码分享

codecombat中国游戏网址:http://www.codecombat.cn/ 所有代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 13.诱饵钻 // 我们在测试一个新的战斗单位:诱饵. // 创建4个诱饵,然后汇报给 Naria var decoysBuilt = 0; loop { var item = this.findNearest(this.findItems()); // 掠夺金币! var x = item.pos

游戏体验篇 二

22,爸爸曾经是小偷. 类似是男人就下一百层,游戏可以收集金币,购买更多扩展功能. 23,求合体. 消除类游戏,三个合体留下一个,合体之后可以再合体.游戏趣味性足,后期难度大. 24,街头格斗之无敌火柴人. 格斗类游戏,只有左右和A/B/J,人物简单,有连击,有击退,有曝气.是做demo不错的选择. 25,奇怪的大冒险. 花样作死游戏,一时新鲜摆了. 26,甜心爱消除. 消除类,4.5个消除时会产生道具.核心就是利用这些产生的道具完成任务. 27,割绳子. 益智类游戏,球会动,割掉绳子球会乱动.

[Unity3D]Unity3D游戏开发之跑酷游戏项目解说

大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.终于到了更新博客的时间.从昨天下午開始,博主開始设计一个跑酷的游戏,到晚上睡觉前这个游戏已经基本完毕. 博主今天早上七点钟就起来了,到早上十点钟终于把整个游戏写完了. 所以,今天的博客的主题就是<Unity3D游戏开发之跑酷游戏项目解说>. 从博主自身来考虑这

codecombat安息之云山峰11-21关及沙漠38关代码分享

codecombat中国游戏网址: http://www.codecombat.cn/ 所有代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 11.零和 // 在两分钟内击败敌方英雄. loop { var enemies = this.findEnemies(); var nearestEnemy = this.findNearest(enemies); var item = this.findNearest(this.findIte

codecombat之Sarven沙漠25-37关代码分享

codecombat中国游戏网址:http://www.codecombat.cn/ 所有代码为javascript代码分享 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25.捡闪亮东西的人 // 很快的获取最多的金币 loop { var coins = this.findItems(); var coinIndex = 0; while (coinIndex < coins.length) { // 把这个封装进循环里枚举所有的硬币 var coin = coi