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\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;?
轉載于:https://www.cnblogs.com/-ifrush/p/10084384.html
總結
以上是生活随笔為你收集整理的T - Memory and Trident CodeForces - 712B( 注意:* ++ = 的优先级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32之Systick(系统时钟滴答
- 下一篇: [HNOI2012]排队