1. 程式人生 > >T - Memory and Trident CodeForces - 712B( 註意:* ++ = 的優先級

T - Memory and Trident CodeForces - 712B( 註意:* ++ = 的優先級

改進 代碼 mem pan 現在 就是 == codeforce 奇數

題意:有四種命令: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\n");
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\n",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\n"); 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\n",rslt); return 0;

T - Memory and Trident CodeForces - 712B( 註意:* ++ = 的優先級