2016-6-19 模拟测试

 NOIP模拟赛  by coolyangzc

共3道题目,时间3小时


题目名


高级打字机


不等数列


经营与开发


源文件


type.cpp/c/pas


num.cpp/c/pas


exploit.cpp/c/pas


输入文件


type.in


num.in


exploit.in


输出文件


type.out


num.out


exploit.out


时间限制


1000MS


1000MS


1000MS


内存限制


256MB


256MB


256MB


测试点


5+(5)


10


10


测试点分值


20


10


10

Problem 1 高级打字机(type.cpp/c/pas)

【题目描述】

早苗入手了最新的高级打字机。最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧。

请为这种高级打字机设计一个程序,支持如下3种操作:

1.T x:在文章末尾打下一个小写字母x。(type操作)

2.U x:撤销最后的x次修改操作。(Undo操作)

(注意Query操作并不算修改操作)

3.Q x:询问当前文章中第x个字母并输出。(Query操作)

文章一开始可以视为空串。

【输入格式】

第1行:一个整数n,表示操作数量。

以下n行,每行一个命令。保证输入的命令合法。

【输出格式】

每行输出一个字母,表示Query操作的答案。

【样例输入】

7

T a

T b

T c

Q 2

U 2

T c

Q 2

【样例输出】

b

c

【数据范围】

对于40%的数据 n<=200;

对于100%的数据 n<=100000;保证Undo操作不会撤销Undo操作。

<高级挑战>

对于200%的数据 n<=100000;Undo操作可以撤销Undo操作。

<IOI挑战>

必须使用在线算法完成该题。

/*第一题:对于百分之200的数据直接放弃了,就冲着前100分打了个模拟,非常水,听说要拿到另外的100分,要用可持久化线段树。*/
#define N 100010
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
int l=0,x,n;
char s[10],a[10],xl[N];
int main()
{
    freopen("type.in","r",stdin);
    freopen("type.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
        scanf("%s",s);
        if(s[0]==‘T‘)
        {
            scanf("%s",a);
            xl[++l]=a[0];
        }
        else if(s[0]==‘U‘)
             {
                 scanf("%d",&x);
                 l-=x;
             }
             else {
                 scanf("%d",&x);
                 printf("%c\n",xl[x]);
             }
    }
    fclose(stdin);fclose(stdout);
    return 0;
}

Problem 2 不等数列(num.cpp/c/pas)

【题目描述】

将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。问在所有排列中,有多少个排列恰好有k个“<”。答案对2012取模。

【输入格式】

第一行2个整数n,k。

【输出格式】

一个整数表示答案。

【样例输入】

5 2

【样例输出】

66

【数据范围】

对于30%的数据:n <= 10

对于100%的数据:k < n <= 1000,

/*第二题是个DP,我觉得还是比较简单的,得了满分
这个DP方程:f[i][j]=(f[i-1][j]*(j+1)%mod+f[i-1][j-1]*(i-j)%mod)%mod;
拿几个例子看看就可以得出了。
*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#define N 1100
#define mod 2012
int f[N][N]={0};
int n,k;
int main()
{

    scanf("%d%d",&n,&k);
    f[1][0]=1;
    for(int i=2;i<=n;++i)
      for(int j=0;j<=i-1&&j<=k;++j)
      {
          if(j>=1)
            f[i][j]=(f[i-1][j]*(j+1)%mod+f[i-1][j-1]*(i-j)%mod)%mod;
          else if(j==0)
               {
                   f[i][j]=f[i-1][j]*(j+1)%mod;
               }
      }
    printf("%d\n",f[n][k]%mod);
    fclose(stdin);fclose(stdout);
    return 0;
}

Problem 3 经营与开发(exploit.cpp/c/pas)

【题目描述】

4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以“EX”为开头的英语单词。

eXplore(探索)

eXpand(拓张与发展)

eXploit(经营与开发)

eXterminate(征服)

——维基百科

今次我们着重考虑exploit部分,并将其模型简化:

你驾驶着一台带有钻头(初始能力值w)的飞船,按既定路线依次飞过n个星球。

星球笼统的分为2类:资源型和维修型。(p为钻头当前能力值)

1.资源型:含矿物质量a[i],若选择开采,则得到a[i]*p的金钱,之后钻头损耗k%,即p=p*(1-0.01k)

2.维修型:维护费用b[i],若选择维修,则支付b[i]*p的金钱,之后钻头修复c%,即p=p*(1+0.01c)

注:维修后钻头的能力值可以超过初始值(你可以认为是翻修+升级)

请作为舰长的你仔细抉择以最大化收入。

【输入格式】

第一行4个整数n,k,c,w。

以下n行,每行2个整数type,x。

type为1则代表其为资源型星球,x为其矿物质含量a[i];

type为2则代表其为维修型星球,x为其维护费用b[i];

【输出格式】

一个实数(保留2位小数),表示最大的收入。

【样例输入】

5 50 50 10

1 10

1 20

2 10

2 20

1 30

【样例输出】

375.00

【数据范围】

对于30%的数据 n<=100

另有20%的数据 n<=1000;k=100

对于100%的数据 n<=100000; 0<=k,c,w,a[i],b[i]<=100;保证答案不超过10^9

/*打了个2^n暴力代码,本来能得10分,结果手贱想打个剪枝,打错了,嗨爆了空间(以后一定注意double是8个字节)*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
#define N 100010
struct XQ{
    int flag;
    double fle;
}stra[N];
int n;
double k,c,w,ans=0;
void input()
{
    scanf("%d%lf%lf%lf",&n,&k,&c,&w);
    for(int i=1;i<=n;++i)
      scanf("%d%lf",&stra[i].flag,&stra[i].fle);
}
void dfs(int u,double p,double mone)
{
    if(u==n+1)
    {
        ans=max(ans,mone);
        return;
    }
    if(p<=0&&stra[u].flag!=2) return;
    if(stra[u].flag==1)
      dfs(u+1,p*(1-0.01*k),mone+stra[u].fle*p);
    else dfs(u+1,p*(1+0.01*c),mone-stra[u].fle*p);
    dfs(u+1,p,mone);
}
int main()
{
    freopen("exploit.in","r",stdin);
    freopen("exploit.out","w",stdout);
    input();
    dfs(1,w,0);
    printf("%0.2lf",ans);
    fclose(stdin);fclose(stdout);
    return 0;
}

正确题解:

/*题解

对于k=100的情况,贪心

对于100%的数据

可以发现,当前的决策只对后面的开采有影响,且剩余耐久度与之后的开采收益成正比,
如果倒着考虑这个问题,得出i-n的星球1点耐久度所能获得的最大收益,
从后往前dp,得出最大值最后乘w就是答案*/
/*这道题目只要能想出倒着处理,一切都迎刃而解了!!*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define N 100010
int flag[N];
double a[N];
int n;
double k,c,w;
double ans=0;
void input()
{
    scanf("%d%lf%lf%lf",&n,&k,&c,&w);
    for(int i=1;i<=n;++i)
    {
        scanf("%d%lf",&flag[i],&a[i]);
    }
    k=(1-0.01*k);
    c=(1+0.01*c);
}
int main()
{
    input();
    for(int i=n;i>=1;--i)
    {
        if(flag[i]==1)
          ans=max(ans,ans*k+a[i]);
        else ans=max(ans,ans*c-a[i]);
/*ans就是i之后的最大收益,因为剩余耐久度与之后的开采收益成正比,所以如果当前取了,那么之后的结果都会有*k,或者*c的影响,所以倒序来做是非常好做的*/
    }
    printf("%0.2lf",ans*w);
    return 0;
}
时间: 2024-10-09 18:33:25

2016-6-19 模拟测试的相关文章

2016.6.19 模拟考试

  2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10 10 测

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

Android单元测试与模拟测试详解

测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabricator differential 发diff时提交需要执行的单元测试,在开发流程上就可以保证远端代码的稳定性). 2. 测什么? 一般单元测试: 列出想要测试覆盖的异常情况,进行验证. 性能测试. 模拟测试: 根据需求,测试用户真正在使用过程中,界面的反馈与显示以及一些依赖系统架构的组件的应用测

微信在线信息模拟测试工具(基于Senparc.Weixin.MP)

目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具在线DEMO:http://weixin.senparc.com/SimulateTool Senparc.Weixin.MP是一个开源的微信SDK项目,地址:https://github.com/JeffreySu/WeiXinMPSDK (其中https://github.com/Jeffrey

Mock 模拟测试简介及 Mockito 使用入门

Mock 是什么 mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代替品. 简单的看一张图 我们在测试类 A 时,类 A 需要调用类 B 和类 C,而类 B 和类 C 又需要调用其他类如 D.E.F 等,假如类 D.E.F 构造很耗时又或者调用很耗时的话是非常不便于测试的(比如是 DAO 类,每次访问数据库都很耗时).所以我们引入 Mock 对象. 如上图,我们将

翻译:Gregory Larsen,2016/02/19(第一版:2014年12月17日)高级T-SQL阶梯1级:使用CROSS JOIN介绍高级T-SQL

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/119933/ 原文作者:Gregory Larsen,2016/02/19(第一版:2014年12月17日) 系列 本文是"Stairway Series:Stairway to Advanced T-SQL"的一部分 这个阶梯将包含一系列文章,这些文章将在前面两个T-SQL阶梯,T-SQL DML和T-SQL超越基础知识的T-SQL基础上进行扩展. 这个楼梯应

2018冬令营模拟测试赛(十九)

2018冬令营模拟测试赛(十九) [Problem A]小Y 试题描述 输入 见"试题描述" 输出 见"试题描述" 输入示例 见"试题描述" 输出示例 见"试题描述" 数据规模及约定 见"试题描述" 题解 目前未知. 这题目前就能做到 \(O(n \sqrt{M} \log n)\),其中 \(M\) 是逆序对数,然而会被卡 \(T\):当然这题暴力可以拿到和左边那个算法一样的分数,只要暴力加一个剪枝:当左

noip模拟测试11

T1:string 第一眼秒出思路,这不就是排序那道题的加强版吗? 然而歪?解复杂度虽然是对的,但常数过大,竟被卡到70 歪?解:(实际上std写的就是这个,但据说std被卡掉了 OAO) 因为字符集很小,所以我们可以把区间排序改为区间查询和覆盖 即:先查询区间内所有字符的个数,再从左端点开始按照大小关系依次将长度为字符个数的区间修改为该字符. 期望复杂度O ( 26*mlogn ),实际复杂度O ( 26*mlogn*(巨大的常数) ) 所以需要一(feng)定(kuang)的卡常 正?解:

noip模拟测试21

T1:折纸 这道写崩我也是没话说…… 模拟就完了,记录每次的折叠点,每次将之前的都扫一遍就完了 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<cmath> 5 #include<algorithm> 6 #include<cstdlib> 7 #define ll long long 8 using namespace std; 9 con

[考试反思]0929csp-s模拟测试55:沦陷

菜得过分. 面对T1的大板子不知所措,然后T2的贪心不小心把排序语句删了... T1这种大模板啊...其实我是觉得我能打出来的,然后先用一个小时码了一个2k. 然后做T2想贪心就出来了.十分钟码完T3暴力之后回T1打对拍瞬间爆炸. 于是又重新打了一个2k,WA0.对拍发现. 然后考试就没几分钟了交暴力走了. 不要打完就跑,记得早点对拍改进思路. T1: 的确是挺裸的线段树.离散化或者权值线段树都可以. 但是考场上两个都打出来都死了. 最后用离散化A的. 1 #include<cstdio> 2