酷暑一夏1

不忘初心,方得始终


Vijos 1454 牛的RP 题解

题目

天苍苍,野茫茫,JSZX的菜鸟们来到OI牧场旅游,看到了好多好多的牛。OI牧场所有的牛都觉得自己的Rp最高(简称RP牛),为此他们常争论不休。于是,他们让JSZX的菜菜们用最最朴素的方法找出这只RP牛。
经过讨论,最菜的mmk想出了最朴素的方法:
我们要以cows的名字为线索,来找出RP牛。
首先,得到n头牛的名字清单(每头牛的名字是一个仅包含小写字母的字符串,且这些牛的读写方式比较特殊—从右到左),然后对每头牛进行检验,检验按照牛的读写方式进行。规则如下:
1.Rp 牛的名字中必须有子串“jszxoier”
2.将名字中的每个“cow”的替换为“bird”。
3.计算Rp值:A为名字中子串“r”的个数;
B为名字中子串“p”的个数;
C为名字中字串“rp”的个数;
Rp值即为5×A+5×B+20×C。
最后输出RP牛的名字,若有多个RP牛,则输出名字最短的那个。
假如你也是牛中一员,尽管你很不屑这样的水题,但是,你很想到RP牛那里分点Rp,所以你决定解决这道题,并算出RP牛的Rp是多少。

题解

字符串处理,注意转换前后的恢复(例如替换、反转等)。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
//#define DEBUG_SWAP
//#define DEBUG_REPLACE
//#define DEBUGSWITCH
const int MAXN=3000+5;
const int MAXL=300*2+5;
char inp[MAXN][MAXL];int l,maxi,maxv,minl=INT_MAX;
int main()
{
int n,tmp;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",inp[i]+1);
l=strlen(inp[i]+1);
if(l<8) continue;
for(int j=1;j<=l/2;j++)
std::swap(inp[i][j],inp[i][l-j+1]);
for(int j=1;j<=l-7;j++)
{
if(inp[i][j]=='j' && inp[i][j+1]=='s' && inp[i][j+2]=='z' && inp[i][j+3]=='x' && inp[i][j+4]=='o' && inp[i][j+5]=='i' && inp[i][j+6]=='e' && inp[i][j+7]=='r') goto pass1;}
continue;
pass1:
for(int j=1;j<=l-2;j++)
{
if(inp[i][j]=='c' && inp[i][j+1]=='o' && inp[i][j+2]=='w')
{
for(int k=l;k>=j+3;k--)
inp[i][k+1]=inp[i][k];
inp[i][j]='b';inp[i][j+1]='i';inp[i][j+2]='r';inp[i][j+3]='d';l++;
}
}
tmp=0;
for(int j=1;j<=l;j++)
{
if(inp[i][j]=='r' && inp[i][j+1]=='p')
{
tmp+=30;
j++;
continue;
}
if(inp[i][j]=='r')
tmp+=5;
if(inp[i][j]=='p')
tmp+=5;
}
if(maxv==tmp)
{
if(minl>l)
{
maxi=i;
minl=l;
}
}
if(maxv<tmp)
{
maxv=tmp;
minl=l;
maxi=i;
}
}
l=strlen(inp[maxi]+1);
for(int j=1;j<=l-3;j++)
if(inp[maxi][j]=='b' && inp[maxi][j+1]=='i' && inp[maxi][j+2]=='r' && inp[maxi][j+3]=='d')
{
for(int k=j+4;k<=l;k++)
inp[maxi][k-1]=inp[maxi][k];
inp[maxi][j]='c';inp[maxi][j+1]='o';inp[maxi][j+2]='w';l--;
}
for(int j=1;j<=l/2;j++)
std::swap(inp[maxi][j],inp[maxi][l-j+1]);
for(int j=1;j<=l;j++)
printf("%c",inp[maxi][j]);
printf("\n%d",maxv);
return 0;
}
最近的文章

洛谷七月月赛A题(3817) 小A的糖果题解

题目小A有N个糖果盒,第i个盒中有a[i]颗糖果。 小A每次可以从其中一盒糖果中吃掉一颗,他想知道,要让任意两个相邻的盒子中加起来都只有x颗或以下的糖果,至少得吃掉几颗糖。 题解对于每两个相邻的糖果盒,如果我们假设左边的糖果盒有$a$颗糖果,右边的糖果盒有$b$颗糖果,并且$a+b&gt;x$,那么 …

于  洛谷 继续阅读
更早的文章

Vijos 1364 Likecloud-吃、吃、吃 题解

题目正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中。某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个nm(n and m&lt;=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边。餐桌被划分为了nm个小方格,每一个方格中都有一个圆形的巨型大餐盘 …

于  Vijos 继续阅读