jzxx奖牌整理(简单思考)

tyvj群上有人问就写了一下。。。似乎明白了很多东西

放心,O(常数)的算法肯定有,不要在意我前面的啰嗦。。。。

问题
G: 【基础】奖牌整理

时间限制: 1
Sec  内存限制: 32
MB
提交: 12  解决: 3
[提交][状态][讨论版]

题目描述

上完一天的课,小 Z 不但没有一丝疲惫感,反而觉得浑身是劲,好象又回到了童年, 他蹦蹦跳跳地回到家,吃过晚饭很快就做完了作业,抬头一看觉得房间太乱了,这不进入 初三后由于课业繁重一直没时间整理房间,现在有空了是时候该好好整理一下了。小 Z 首 先想要整理的是他那些心爱的奖牌,这些奖牌记录了小 Z 成长的足迹,其中有龙城少儿围 棋比赛的银牌,有华罗庚杯少年数学邀请赛的铜牌,份量最重的当数全国信息学奥林匹克 竞赛(National Olympiad in Informatics,简称 NOI)的金牌,小 Z 喜欢把他获得的奖牌 都挂在床头,并且成一字排开状,他每得到一枚奖牌就会在床头钉一颗钉子,将这枚奖牌 挂在所有奖牌的未尾,也就是说小 Z 的奖牌是按获得时间的先后顺序来排列的,现在小 Z 想把它们按金银铜的顺序排列,即所有的金牌挂在最前面,随后是银牌,最后是铜牌。小 Z 重排奖牌的方法很特别,他每次都是同时伸出双手各摘下一块奖牌,然后把这两块奖牌 的位置对换一下,即左手摘下的奖牌放到右手摘下的奖牌的位置,右手摘下的奖牌放到左手摘下的奖牌的位置,咦!这怎么看上去有点象交换赋值,太有才了!现在小 Z 想考考你, 给定奖牌序列,计算最少需要几次对换操作就可以将所有奖牌按金银铜牌的顺序排好。

输入

输入数据第一行只有一个正整数 N 表示奖牌序列的长度,其中 1≤N≤1000;第二行有 N 个大写字母,每个大写字母代表一枚奖牌,其中 G 代表金牌,S 代表银牌,B 代表铜牌。

输出

输出数据仅有一行包含一个整数,表示最少需要几次对换操作。

样例输入

9 SSGBBBSBG

样例输出

4

提示

样例解释

S    S    S<  
 G    G
S<    G  
 G    G    G
G<  
 S    S    S  
 S
B    B<    S  
 S    S
B    B  
 B    B<    S
B  
 B    B    B  
 B
S    S<    B  
 B    B
B    B  
 B    B    B
G  
 G    G<    S<  
 B

小 Z 的床头共有 9 枚奖牌,以上数据第一列为 9 枚奖牌的初始序列,每次操作将每列
中箭头指向的两个位置的奖牌对换,对换后变成右边一列的状态,经过 4 次对换操作所有

奖牌就按金银铜牌的顺序依次排好了,可以验证 4
步操作是必不可少的。

数据范围

10%的数据满足:奖牌种类只有两种

30%的数据满足:n≤10

60%的数据满足:n≤100

100%的数据满足:n≤1000

似乎蓝色的弄不掉了,就这样吧。。。

第一眼看到这题想到线段树。。我是不是和zhb神牛一样了。。。(自恋个屁!!)

然后我看清楚了初三得NOI金牌的更神牛小龙。。。跪。。我也初三为什么我没有NOI金牌

一开始我是想到这个做法其实跟冒泡排序很像,写了个程序:


    ans=0;
for (i=1;i<=n-1;i++)
{
for (j=i+1;j<=n;j++)
{
if (a[i]<a[j]) {tmp=a[i];a[i]=a[j];a[j]=tmp;ans++;}
}
}
cout<<ans;

结果很惨:全WA。

为什么呢,其实冒泡排序不是最少步数。。原因是因为冒泡永远是从前往后死板地搜,不要证明了吧。。。

然后我又想了种算法,又爆了。。不好意思发上来。。

这里有一种很简单的解法。。

首先我们得搞清楚一个问题,最后金牌一定在最前面,银牌中间,铜牌最后,那么结果肯定是GGG……GGGSSS……SSSBBB……BBB这样的。。

也就是说我们得让金牌往前站,银牌站中间,剩下位置就是铜牌的。

那么,金牌的位置是从前往后数g个(共有g个金牌),银牌是g+1到第g+s个(共有s个银牌)

只要金牌位上不是金牌,或者银牌位上不是银牌,就一定需要一个操作使金牌或银牌归位,

那么只要统计出有多少金牌银牌需要归位,相加即为答案。。。

但是还有一种特例:金牌在银牌位上,银牌在金牌位上,那么答案应该-1

----------------------------------分析到此结束--------------------------------------------


#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
char a[1005];
int main()
{
int n,i,j,g,s,ans,t1,t2; //g表示金牌个数,s表示银牌个数,t1表示金牌位上银牌个数,t2表示银牌位上金牌个数
cin>>n;
g=0;s=0;
for (i=1;i<=n;i++)
{
cin>>a[i];
if (a[i]==‘G‘) g++;
if (a[i]==‘S‘) s++;
}
ans=0; t1=0; t2=0;
for (i=1;i<=g;i++)
{ if (a[i]!=‘G‘) {ans++;}
if (a[i]==‘S‘) {t1++;}
}
for (i=g+1;i<=g+s;i++)
{ if (a[i]!=‘S‘) {ans++;}
if (a[i]==‘G‘) {t2++;}
}
ans-=min(t1,t2);
cout<<ans;
return 0;
}

-------------------------------------------程序如上----------------------------------------------
























运行编号 用户 问题 结果 内存 耗时 语言 代码长度 提交时间
946712 seekdreamer

G

正确

1284

48

C++/Edit 718
B
2014-06-11
17:02:42

这个OJ似乎和9018很像啊(^-^)

下附一段代码,是tyvj群一盏鲸鱼灯写的,给大家膜拜哈。。。


var
ans,n,i,j,k,tot1,tot2,tot3:longint;
a:array [0..1001] of longint;
ch:char;

begin
readln(n);
tot1:=0;
tot2:=0;
tot3:=0;
for i:=1 to n do
begin
read(ch);
case ch of
‘G‘:
begin
inc(tot1);
a[i] :=1;
end;
‘S‘:
begin
inc(tot2);
a[i] :=2;
end;
‘B‘:
begin
inc(tot3);
a[i] :=3;
end;
end;
end;
i:=1;
j:=tot1+i;
k:=tot2+j;
ans:=0;
while true do
begin
while (a[i] =1) and (i<=tot1) do
inc(i);
if i>tot1 then
break;
if a[i] =2 then
begin
while (a[j] <>1) and (j<=tot1+tot2) do
inc(j);
if j>tot1+tot2 then
begin
while (a[k] <>1) and (k<n) do
inc(k);
inc(ans);
a[i] :=1;
a[k] :=2;
end
else
begin
inc(ans);
a[i] :=1;
a[j] :=2;
end;
end
else
begin
while (a[k] <>1) and (k<=n) do
inc(k);
if k<=n then
begin
inc(ans);
a[i] :=1;
a[k] :=3;
end
else
begin
while (a[j] <>1) and (j<=tot1+tot2) do
inc(j);
inc(ans);
a[i] :=1;
a[j] :=3;
end
end;
end;
j:=tot1+1;
k:=tot2+j;
while true do
begin
while (a[j] =2) and (j<=tot1+tot2) do
inc(j);
if j>tot1+tot2 then
break;
while (a[k] <>2) and (k<=n) do
inc(k);
inc(ans);
a[j] :=2;
a[k] :=3;
end;
writeln(ans);
end.

我会告诉你我没看吗..但是他过了是真的...

应该很多人需要pas代码吧.......

jzxx奖牌整理(简单思考),布布扣,bubuko.com

时间: 2024-12-19 15:20:36

jzxx奖牌整理(简单思考)的相关文章

【简单思考】noip模拟赛 NTR酋长

NTR酋长 (ntr.pas/.c/.cpp) 黄巨大终于如愿以偿的进入了czy的后宫中……但是czy很生气……他要在黄巨大走到他面前的必经之路上放上几个NTR酋长来阻挡黄巨大. 众所周知,NTR酋长有一个技能是沟壑(F).它会在地图上产生一条长长的障碍物阻挡人前进.Czy打算在一个n*m的矩形(必经之路?)中放上NTR酋长.NTR酋长要一个一个放下去,而且每放一个都会向四角倾斜的方向放出无限长的沟壑,而已经被沟壑挡住的地方就不能再放NTR酋长了. 请注意:不会出现沟壑的路径挡住另一个沟壑的情况

项目开发中使用并发模型常见问题的整理与思考

需求: 数量不定,会定期更新数据,且数据量大的一堆数据,需要在短时间内调用某个接口获取到所有的数据,随后根据返回的json键值进行分类处理. 需求如上,初步分析,我们必然会用到多线程来做,即开一定数量的线程去调用接口获取数据,随后处理返回的json数据,这一套我们需要分开来做,调用接口获取数据我们可以看成是生产者,而处理返回的数据,将其分类就可以看作是消费者.那么,现在我们要来思考下采用这套模型可能会产生的问题.首先,如果生产者生产的数据的速度小于消费者消费的速度,那么此时,我们就需要挂起消费者

需要整理及思考的一些事情

1.工作时长及如何保证结果: 2.如何保证每一段时间只做一件事情,措施方法 3.搞清楚别人得需求(关心什么,能否满足,如何满足,如何做到99分) 4.思考每天真正需要花时间投入的事情,然后全力投入 5.如何合理的分配自己的时间.(这里有2个方面,1是授权问题,2是要提高效率:3是拒绝无关的事情) 6.整理出一个问题产生到解决的流程,方法. 7.整理组网方式,接线方式,原理.特点. 8.阅读测试相关书籍,做读书笔记.

一个微博数据库设计带来的简单思考

http://www.blogjava.net/kalman03/archive/2010/07/19/326558.html 在微博系统中,当前用户.关注者(也就是粉丝).被关注者(崇拜对象)这三种角色是少不了的.他们之间看似简单的关系,但是其中数据库表将如何设计,却让我很难琢磨,在如下解决方案中,你们会选择哪种?为什么要选择这种?是否有更好的解决方案? 解决方案一: 表名 用户信息表 字段名 字段代码 字段类型 描述 用户名 User_id Varchar(20) 主键 登陆密码 Passw

关于字符编码的一些简单思考

在上一篇提到的BOM头,实际上牵扯到文本的编码问题,BOM头是出现在windows下用文本编辑器编写文件后,按照UTF-8的格式下保存文件而我们在编辑php脚本的时候通常是用utf-8的格式保存脚本文件,在这种情况下,我们发现不了bom头的存在.可是如果我们将php的脚本文件按照gbk编码保存我们就能轻易发现bom头的存在,道理很简单 我们先看utf-8的编码规则,utf-8采用的是动态编码,实际上是以字节为单位对unicode(通用码)做的再编码,对于0x00-0x7F之间的字符,UTF-8编

(1)kendo UI使用基础介绍与问题整理——简单说明

由于项目需要,指定我们使用kendo UI作为前端框架,然后开始入了kendo的"坑". 前期是学习阶段,对各个插件的用法进行了基本的了解,开始并未觉得有什么严重问题,确实kendo的前端的大部分插件都是有的,包括列表Grid.下拉列表(带搜索)dropdownlist 等等.从官网截图如下: 在实际项目的使用过程中,由于项目的实际需求与现有插件的差异,显示效果的差异,还有涉及到后台数据交互等问题,过程相对崎岖. 由于对esay UI等前端框架本人也并非很了解,所以此处没有对kendo

关于redis数据库的简单思考

redis数据库中有以下几种数据类型: 字符串,哈希,列表,集合,有序集合 它们应用的场景如下: 字符串用法单一,用于存储一个key的值,用于一一对应的场合 列表作为数组来使用 对于哈希,特别适用于存储对象.比如,用于面向对象的思维方式,key可以作为对象名,field作为property的名字,value作为property的内容 集合具有去重的性质,单纯的集合用于对某个key中互不相同的成员. 有序集合可用于一些对数据大小敏感的场合.比如,key作为对象名,score作为成员的分数值,mem

杂题整理 简单复习

随心情更新 不复习 就是模拟赛遇到三月份写的欧拉路 想一年都不会 二分 POJ3104 题意:有一些衣服,每件衣服有一定水量,有一个烘干机,每次可以烘一件衣服,每分钟可以烘掉k滴水. 每件衣服没分钟可以自动蒸发掉一滴水,用烘干机烘衣服时不蒸发.问最少需要多少时间能烘干所有的衣服.. 其实和模拟赛T2 很像 你面临着两个决策的选择 不过一个需要等待 一个可以直接进行 考虑 此时二分这个风干的时间 mid 那么 考虑check怎么写 如果一个点的晾干时间 > 此时二分的mid  那么我们考虑 最有策

游戏服务器架构的思考

时间总是在不经意的时候就流走了,突然回想我已经做了四年游戏开发,经历了几个游戏项目,以前项目中的游戏服务器框架都不是我心中理想的框架,虽然不知道是不是我见识还不够.下面记录下我对游戏服务器架构的简单思考.好的游戏框架可以提高开发效率,节省人力成本.首先最简单的服务器框架,那就是只要一个网关和一个游戏服务器.如图: 图中agentserver负责客户端连接,客户端收发数据,将客户端数据转发给服务器,将服务器数据转发给客户端,几乎没有逻辑,这样可以应对大并发io.所以agent可以采用一个epoll