9.22 NOIP模拟题

吉林省信息学奥赛 2017 冬令营
                                                                                                                                                                                                      day2

嗯 今天题目好水

嗯 今天爆零了好伤心......

值得纪念。

三道题读错了两道,T3瞎贪心只过了样例。

这就NOIP了,长点心吧。

OIER 密码

【问题描述】
吉林省的 OIER 们保密意识很强,总是将信息加密。
有一个仅含小写字母的字符串,我们把它按如下方法加密:
步骤 1:把所有连续的相同字母都用一个字母代替。比如 aaabbbb 被替换为
ab。
步骤 2:在随机的位置插入两个相同的小写字母。重复 步骤 2 很多次。
下面是一个加密的实例
初始字符串 jjjlloooiieerr
执行步骤 1 之后变成 jloier
插入 aa 之后变成 jloiaaer
插入 bb 之后变成 jloiabbaer
插入 ll 之后变成 jllloiabbaer
现在我们给定加密后的字符串,求执行 步骤 1 之后的字符串是什么。
【输入格式】
从文件 password.in 中输入数据。
一个字符串,表示加密后的字符串。
【输出格式】
输出到文件 password.out 中。
一个字符串,表示执行 步骤 1 之后的字符串。
【样例输入】
jllloiabbaer
【样例输出】
jloier
【数据规模与约定】
对于 30%数据, 加密后的字符串的长度<=1000
对于 70%数据, 加密后的字符串的长度<=100000
对于 100%数据, 加密后的字符串的长度<=1000000

/*
话说这个题确实没问题? 如果加密后的字符串是aaaabcdefgaaaa
std给出的结果是bcdefg但如果第一次加密完是abcdefg然后第二次加密恰好都是在首尾加了a呢?
是不是也可以...因为第一步消除的是连续的相同字母. abcdefg中a并不连续啊。那为何输出bcdefg?

思想还是很好的,类似括号匹配 用栈实现。
下面粘出std
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
using namespace std;
int a[1000001];
char s[1000001], in[1000001];
bool cant[1000001];
int n;
vector<char> ans;
stack<char> S;
int main()
{
   // freopen("password.in", "r", stdin);
    //freopen("password.out", "w", stdout);

    gets(s + 1); n = strlen(s + 1);
    for (int i = 1; i <= n; i++)
        if (S.size() && S.top() == s[i])
            S.pop();
        else S.push(s[i]);
    while(S.size()) ans.push_back(S.top()), S.pop();
    reverse(ans.begin(), ans.end());
    for (int i = 0; i < (int)ans.size(); i++) putchar(ans[i]);

}

投资

【问题描述】
吉林省的 OIER 们投资了一支股票,大家都知道股票有赚有赔,现给出 n 天
里这支股票的涨跌情况,都为整数,涨为正,跌为负。OIER 们想知道天数在 s
到 e 之间的这只股票涨跌的最大连续和 。
【输入格式】
从文件 invest.in 中输入数据。
第一行有三个正整数 n、s 和 e ,同上描述。
接下来有 n 行,每行一个整数 ai,组成数列,数列的顺序不可以变换。
【输出格式】
输出到文件 invest.out 中。
输出长度在 s 和 e 之间连续的数列数的和的最大值。
【样例输入】
6 2 4
4
-3
9
12
-8
9
【样例输出】
22
【数据规模与约定】
对于 30%数据,1<=s<=e<=n<=100
对于 100%数据,1<=s<=e<=n<=100000
对于 100%数据,-10000<=ai<=10000

/*
单调队列...可惜我并没有读懂题目,用线段树写了0分

题意是让着求长度为 l~r 的最大子段和
首先可以从l开始枚举i,i-l就是右端点,i-r就是左端点 答案就是 Max(sum[i]-min(sum[x])) (l<=x<=y)
用单调队列维护min(sum[x])
*/
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int n,x,y;
int q[110000];
int sum[110000];
int f[110000];
int l=1,r;
int ans=-10000000;
int main()
{
    freopen("invest.in","r",stdin);
    freopen("invest.out","w",stdout);
    scanf("%d%d%d",&n,&x,&y);
    for(int i=1;i<=n;i++)
    {
        int tmp;
        scanf("%d",&tmp);
        sum[i]=sum[i-1]+tmp;
    }
    for(int i=x;i<=n;i++)
    {
        while(l<=r&&sum[q[r]]>=sum[i-x])r--;
        q[++r]=i-x;
        while(l<=r&&q[l]<i-y)l++; //q[l]是枚举的区间起点,i-y是左端点 不在范围内 l++
        f[i]=sum[i]-sum[q[l]];
        ans=max(ans,f[i]);
    }
    printf("%d",ans);
    fclose(stdin);
    fclose(stdout);
    return 0;
}

学习 计划

【问题描述】
吉林省 OIER 们都是爱学习的同学,所以他们想学习更多的课程。长春市教
育局开设了“云课程”网络学习平台,一共有 n 门课程,但这个平台有个弊端,就
是每门课程在时间 Ti 之后将不再开放,并且每门课程要想学会需要 Ci 的时间,
聪明的你帮助吉林省 OIER 们计划一下,使他们能够学习最多的课程。
【输入格式】
从文件 plan.in 中输入数据。
第一行,一个整数 n
下面 n 行,每行两个数 Ti 和 Ci
【输出格式】
输出到文件 plan.out 中。
一行 一个整数,完成的最多任务数。
【样例输入】
4
5 1
3 2
7 6
1 1
【样例输出】
3
【数据规模与约定】
对于 30%数据,n<=100
对于 100%数据,n<=100000

/*
因为有每个都有时间限制,所以容易想到按时间限制先排个序
然后模拟,并且维护一个优先队列记录加入元素的使用时间
如果当前使用时间总和大于下一个的开放时间,就弹出对首
用队首和当前的所需时间作比较,更新答案并加入更小的那个。
*/
#include<iostream>
#include<queue>
#include<cstdio>
#include<algorithm>

#define N 100001

using namespace std;
priority_queue<int>q;
int n,s,ans;
struct node
{
    int Ti,ci;
}a[N];

bool cmp(node x,node y)
{
    return x.Ti<y.Ti;
} 

int main()
{
    freopen("plan.in","r",stdin);
    freopen("plan.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    scanf("%d%d",&a[i].Ti,&a[i].ci);
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        if(a[i].ci>a[i].Ti) continue;
        if(s+a[i].ci<=a[i].Ti)
        {
            ans++;
            s+=a[i].ci;
            q.push(a[i].ci);
        }
        else if(a[i].ci<q.top())
        {
            s-=q.top();s+=a[i].ci;
            q.pop();q.push(a[i].ci);
        }
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-11-05 17:30:34

9.22 NOIP模拟题的相关文章

8.22 NOIP 模拟题

  8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc 4.9.2 fpc 2.6.2 评测环境 64 位 Linux, 3.3GHZ CPU 评测软件 Lemon 评测方式 忽略行末空格和回车 特别注意:c/c++ 选手使用 printf 输出 64 位整数请使用%lld 1 注意事项 A 债务 文件名                            输入文件             输出文件  

[BZOJ入门OJ2092][Noip模拟题]舞会

2092: [Noip模拟题]舞会 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 9  Solved: 5 [Submit][Status][Web Board] Description 学校举行舞会啦,一共有N个人参加,所有人站成一排,从左开始编号,最左边的人编号为1 ,最右边的为N.每个人跳舞的熟练度我们用一个整数表示,第i个人的熟练度为Ai,每次熟 练度最接近的一对相邻男女会出列跳舞,如果有多对那么最左边的那一对会先出列,请你给 出出列跳

noip模拟题题解集

最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定的N和M,求不发生爆炸的放置核物质的方案总数 输入:输入文件只一行,两个正整数N,M( 1<N<50,2≤M≤5) 输出:输出文件只有一个正整数S,表示方案总数. 运用升格思想.设N个坑不会发生爆炸的方案数是f[N],那么我们假设N以前的坑的方案 都已知了,那么我们只需要考虑第N个坑如何放即可(顺

[2016.6.11] NOIP模拟题

T1:贪吃蛇snake [题目描述] 哲哲迷上了一个非常有意思的游戏,这个游戏的内容就是通过上下左右来操作一条蛇的前进,比方说,你现在正在向上走,而你按了一下右,那么这条蛇就会转向右走,很有趣吧!这个游戏的名字叫做贪吃蛇.但是,这个看起来简单的游戏也挺需要操作的,如果你不小心撞到了墙,或是撞到自己的身体的话,你就输了. 可是,哲哲由于手指灵活度不够,经常撞墙而死,所以,他自己设计了一个没有墙的贪吃蛇地图,地图可以表示成若干个点,而你可以操作蛇头从某一个一个点到它相邻的点上.这样,游戏的难度降低了

6.19 noip模拟题(题目及解析转自 hzwer 2014-3-15 NOIP模拟赛)

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,表

NOIP模拟题 2017.7.3 - 模拟 - 贪心 - 记忆化搜索

直接暴力模拟,注意判数据结构为空时的取出操作. Code 1 #include<iostream> 2 #include<cstdio> 3 #include<ctime> 4 #include<cctype> 5 #include<cstring> 6 #include<cstdlib> 7 #include<fstream> 8 #include<sstream> 9 #include<algorit

【noip模拟题】天神下凡(贪心)

vijos某次模拟赛原题... 处理出每个圆的一级祖先就行了... 其实没有那么麻烦,贪心即可出解. 我们将每个圆转换成线段后按左端点小右端点大的方法排序 然后维护一个栈: 对于每一个圆i 如果栈顶右端点比圆i的右端点小,则出栈,直到栈空 否则i的一级祖先就是栈顶,并且加入i到栈. 证明: 因为左端点排序,所以问题转换为找一个最小的右端点能够包含此线段 假如栈顶的右端点比当前右端点小,显然对于所有将来的线段,不可能包含将来的线段(或者说,尽管能,也不是最优解,因为最优解就是当前i) 然后如果有n

【noip模拟题】挖掘机(模拟题+精度)

这题直接模拟. 可是我挂在了最后两个点上QAQ.唯一注意的是注意精度啊...用来double后边转成整数就忘记用longlong...sad #include <cstdio> #include <cstring> #include <cmath> #include <string> #include <iostream> #include <algorithm> #include <queue> #include <

9.27考试 SD_le NOIP模拟题 第三题 建造游乐场题解

这道题当时没读完题时脑部了无数种问法,然而最后还是猝不及防.一开始还以为是结论题,然而死也退不出来,就先去打第二题了.然后在想这道题时,我想到的是这样的思路(由于当时时间紧迫,尚未完善): 我每次向图中增加两个点,那么这两个点对于所有入度为偶数的点是否连接一定是一致的,如果这两个点相连,那么如果使他们分别和一个入度为单数的点相连,那么他们就是新的入度为单数的点,其他情况就不叙述了,太多了.还不是正解. 由于最后时间太紧迫了,我不得不打暴力去保分,结果还好丢人好丢人的打错了-- 正解其实还是挺有意