T - Memory and Trident CodeForces - 712B( 注意:* ++ = 的优先级

Posted -ifrush

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T - Memory and Trident CodeForces - 712B( 注意:* ++ = 的优先级相关的知识,希望对你有一定的参考价值。

题意:有四种命令:U代表上移一个单位,D代表下移一个单位,R代表右移一个单位,L代表左移一个单位。

现在给出一串命令,问怎样修改命令中的任意一条命令,使得命令结束后重新返回原点,并且修改的步数最少。

思路:把问题抽象化,统计四中命令各自有多少,之后D与U相互抵消(numD-numU),R与L相互抵消(numR-numL),将两个差值的绝对值相加之后除以二就是结果。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void f(int *x,int *y){
if(*x>=*y){
(*y)++;
}
if(*x<*y){
(*x)++;
}
}
void g(int *x,int *y){
if(*x>=*y){
(*x)--;
}
if(*x<*y){
(*y)--;
}
}
int main(){
char str[100500];
gets(str);
int i,len=strlen(str),l=0,r=0,d=0,u=0;
int rslt=0;
if(len%2!=0){
printf("-1 ");
return 0;
}
else for(i=0;i<len;i++){
if(str[i]==‘L‘)l ++ ;
if(str[i]==‘R‘)r ++;
if(str[i]==‘U‘)u++;
if(str[i]==‘D‘)d++;
}
if((l+r)%2!=0){
f(&l,&r);
g(&u,&d);
rslt++;
}
rslt+=(abs(l-(l+r)/2)+abs(u-(d+u)/2));
printf("%d ",rslt);
return 0;
}

 

void函数是判断l+f 是奇数时,将其换成偶数 而不增加补数

这是通过的代码 ,但起初结果死活不对  后来发现是因为函数中写的是*x++ 而++的优先级是比*高的,自然就不对了

but,看了别人才发现完全不用这么复杂好吧

如果l+f为奇数结果会在偶数的基础上增加一步,而     rslt+=(abs(l-(l+r)/2)+abs(u-(d+u)/2))的值此时也加一,所以判断奇数偶数完全没有必要, 结果是一样的

 

改进后

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int  main(){
     char  str[100500];
     gets(str);
     int i,len=strlen(str),l=0,r=0,d=0,u=0;
     int  rslt=0;
     if(len%2!=0){
        printf("-1
");
        return 0;
     }
     else for(i=0;i<len;i++){
        if(str[i]==L)l ++ ;
        if(str[i]==R)r ++;
        if(str[i]==U)u++;
        if(str[i]==D)d++;
     }

     rslt+=(abs(l-(l+r)/2)+abs(u-(d+u)/2));
     printf("%d
",rslt);
     return 0;

 













































以上是关于T - Memory and Trident CodeForces - 712B( 注意:* ++ = 的优先级的主要内容,如果未能解决你的问题,请参考以下文章

Memory and Trident(CodeForces 712B)

codeforces 712B. Memory and Trident

Codeforces 712B. Memory and Trident

CodeForces 712B Memory and Trident (水题,暴力)

[CodeForces - 712D]Memory and Scores (DP 或者 生成函数)

Codeforces 712 D. Memory and Scores (DP+滚动数组+前缀和优化)