这次考试安排在早上,到教室就开始考试了;
今天的题没有昨天的水;
第一题:
题目描述:
很多人的编号为1到n,位置是xi和yi,从1好开始,每个人把离他最近的人淘汰,然后编号2的人如果没被淘汰就淘汰离自己最近的人知道剩下最后1个人;
题目解析:这题只要按照要求强模拟就好了;
第二题:
题目描述:
有两种椅子,用S和L表示,S表示单人椅;
L表示双人椅;
S的两边都可以放杯子;
L只有最两边能放杯子;
*表示杯子,如:
* S * L L *L L * S * S *L L *
问有多少人能单独放杯子
???
这题只要把能放杯子的地方全求出来,和人数比较;
比人数大就输出人数;
不然就输出地方数。
具体代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x=0,ren=0,zw=0;
char a[200];
cin>>n;
for(int i=1;i<=n;i++)
{
x++;
a[x]=' ';
x++;
cin>>a[x];
}
x++; a[x]=' ';
for(int i=1;i<=x;i++)
{
if(a[i]=='S')
{
a[i-1]='*'; a[i+1]='*';
}
if(a[i]=='L')
if(a[i+2]=='L')
if(a[i+1]==' ')
{
a[i-1]='*'; a[i+3]='*';
}
}
for(int i=1;i<=x;i++)
{
if(a[i]=='S'||a[i]=='L') ren++;
if(a[i]=='*') zw++;
}
if(zw>=ren) cout<<ren<<endl;
else cout<<zw<<endl;
return 0;
}
第三题:
题目描述:
给你一串数字,0代表品(,1代表 );
()的值是1;
字符串A的值是是(A) ,(A)的值是2*是(A);
字符串A和B的s(A)和s(B)的值是他们的和;
这题要
但是明显需要用括号匹配来计算每个括号所属的层数。
然后用dfs来求出每个括号嵌套的值。
第四题:
x去旅行,
开一辆车,最多装g升油,
每跑一公里要消耗一升油;
原有b升油,途中有n个加油站;
给了位置和每升油的价格,问你要到离自己d公里的目的地最少要花多少钱到,如果到不了,输出-
这道题模拟性质也比较重,可以各种搞法,并且可以拿到不少的分数。
不过,数据项的存储要整理好,这个是我们必须要具备的一个基本技能。
但是如何高效的去组织油箱里的油? 并且还要保证足够。
可以利用那个神奇的数据结构: 单调队列来维护油箱。
我们人为的将油箱的油按价格进行排序,这样就能更好的计算价格。
我们再认为,只有燃烧掉的油才是买过的油,加进油箱的油可以退掉,这样我们就能保证在有解的情况下,肯定可以走到最后。
那么,我们就用一个单调队列记录这个油箱的油,每个队列元素记录这个价格的油的价格和现在保有量。最初的油的价格为0.
这样,到一个新的加油点后,先把用的油减掉(队头出队),再加新的油(队尾进队,单调队列进队的时候,当前油的价格如果比队尾的价格便宜,那么队尾保存的油就要被淘汰)。
到此为止,我们用了O(n)的时间复杂度解决了这个问题。