Game Rank Gym-101550G
(1)初始版本
#include <stdio.h>
#include <string.h>
int
main() {
int rak, star, i, len, t;
char s[10005];
while( scanf("%s", s) != EOF ) {
// 输入连续的字符串,getchar()可不用
getchar();
//puts(s);
len = strlen(s);
rak = 25; // 当前等级
star = 0; // 当前星星
t = 0; // 连赢
for( i = 0; i < len; i++ ) {
if( rak < 1 ) { // legend后,输赢不影响
break;
}
if( s[i] == 'W' ) { // 赢一局
star++;
t++;
if( rak >= 6 && rak <= 25 && t >= 3) { // 额外的奖励
star++;
}
if( rak >= 21 && rak <= 25 && star > 2 ) {
rak--;
star -= 2;
}
else if( rak >= 16 && rak <= 20 && star > 3 ) {
rak--;
star -= 3;
}
else if( rak >= 11 && rak <= 15 && star > 4 ) {
rak--;
star -= 4;
}
else if( rak >= 1 && rak <= 10 && star > 5 ) {
rak--;
star -= 5;
}
}
else if( s[i] == 'L' ) { // 输一局
t = 0; // 连赢=0
if( rak >= 1 && rak <= 20 ) { // 掉星
star--;
if( star < 0 ) { // 会掉级
if( rak == 20 ) { // 20级不会掉级
star = 0;
}
else if( rak >= 15 && rak < 20 ) { // 边界,15掉级会掉到下一个等级区间
rak++;
star = 2; // 满星减一
}
else if( rak >= 10 && rak < 15 ) {
rak++;
star = 3;
}
else if( rak >= 1 && rak < 10 ) {
rak++;
star = 4;
}
}
}
}
}
if( rak < 1 ) {
printf("Legend\n");
}
else {
printf("%d\n", rak);
}
}
return 0;
}
(2)函数的写法
#include <stdio.h>
#include <string.h>
char s[10005];
int Rank, Star;
void
up(int v){
Star += v;
if( Rank >= 21 && Rank <= 25 && Star > 2 ) {
Rank--;
Star -= 2;
}
else if( Rank >= 16 && Rank <= 20 && Star > 3) {
Rank--;
Star -= 3;
}
else if( Rank >= 11 && Rank <= 15 && Star > 4 ) {
Rank--;
Star -= 4;
}
else if( Rank >= 1 && Rank <= 10 && Star > 5 ) {
Rank--;
Star -= 5;
}
}
void
down(){
if( Rank > 20 ) {
return ;
}
if(Star) {
Star--;
return ;
}
if(Rank < 20) {
Rank++;
if( Rank >= 16 && Rank <= 20 ) {
Star = 2;
}
else if( Rank >= 11 && Rank <= 15 ) {
Star = 3;
}
else if( Rank >= 1 && Rank <= 10 ) {
Star = 4;
}
}
}
int
main(){
int n, num, i;
while( ~scanf("%s", s) ) {
n = strlen(s);
Rank = 25;
Star = 0;
num = 0;
for( i = 0; i < n; i++ ) {
if( Rank == 0 ) {
break;
}
if( s[i] == 'L' ) {
down();
num = 0;
}
else if( s[i] == 'W' ) {
num++;
if( Rank >= 6 && num >= 3 ) {
up(2);
}
else {
up(1);
}
}
}
if( Rank != 0 ) {
printf("%d\n",Rank);
}
else {
printf("Legend\n");
}
}
return 0;
}
(3)反省
(1)满星减一,开始一直以为是满星,论学习英语的重要性。
(2)Legend的输出位置,开始直接在for()里面输出,结果在for()后面会再次输出一个0,
当时脑子可能被狗叼走了,这题一直卡到比赛最后没做出来,其实发现了边界和减一这两个坑后,思路是完全正确的。
不能丢了教训,以后注意细节方面/逻辑严密。
(3)学习大佬处理输一局的思路,掉级的话,先掉级,根据掉级后的等级,再处理星星;
而不是根据当前等级,掉级+处理星星,前者不需要处理边界,可以省少许时间。