Problem Description X在大家的幫助下終於找到了一個妹紙,於是開始了漫漫的追求之路,那麼大家猜一猜X能不能追的上呢? X初始對妹紙有一個心動值,妹紙對X有一個好感值,在追求時發生的的一系列事件中,當X對妹紙的心動值大於等於100,並且妹紙對X的好感值也大於等於100時,X就追上了妹 ...
Problem Description
X在大家的幫助下終於找到了一個妹紙,於是開始了漫漫的追求之路,那麼大家猜一猜X能不能追的上呢?
X初始對妹紙有一個心動值,妹紙對X有一個好感值,在追求時發生的的一系列事件中,當X對妹紙的心動值大於等於100,並且妹紙對X的好感值也大於等於100時,X就追上了妹紙。並且不會因為以後兩個值低於100的情況而分手。
事件1:兩個人一起吃飯,那麼心動值和好感值都增加5
事件2:兩個人一起逛街,那麼心動值和好感值都增加10
事件3:如果X給妹紙買了禮物,那麼心動值減少5,好感值增加10
事件4:如果妹紙給X買了禮物,那麼心動值增加20,好感值減少5
那麼我們猜一猜吧。
Input
第一行輸入n(n < 100),表示發生了n個事件。
之後的n行,每行一個字元,表示事件i發生了。(事件1的代號A,事件2的代號B,事件3的代號C,事件4的代號D)
最後一行,輸入兩個整數k1,k2(0 < k1 < 100 && 0 < k2 < 100),k1表示X對妹紙的心動值,k2表示妹紙對X的好感值。
Output
輸出一行。
如果X追上妹子,那麼輸出”happy!”。
否則,輸出”tiantai!” (不含引號) 。
Sample Input
4 A B C D 80 80
Sample Output
happy!
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 int main() 6 { 7 int i,n,m,z,f=0; 8 char a[100]; 9 scanf("%d",&z); 10 getchar(); 11 for(i=0;i<z;i++) 12 { 13 scanf("%c",&a[i]); 14 getchar(); 15 } 16 scanf("%d %d",&n,&m); 17 for(i=0;i<z;i++) 18 { 19 if(a[i]=='A') 20 { 21 n=n+5; 22 m=m+5; 23 } 24 else if(a[i]=='B') 25 { 26 n=n+10; 27 m=m+10; 28 } 29 else if(a[i]=='C') 30 { 31 n=n-5; 32 m=m+10; 33 } 34 else if(a[i]=='D') 35 { 36 n=n+20; 37 m=m-5; 38 } 39 printf("%d %d\n",n,m); 40 if(n>=100&&m>=100) 41 { 42 f=1; 43 44 } 45 46 } 47 if(f==0) 48 { 49 printf("tiantai!\n"); 50 } 51 else printf("happy!\n"); 52 return 0; 53 }
非常簡單的一道題目,只需要註意字元輸入時規避回車的影響每次做完一件事就進行一次判斷就可以了
問題在於和我同學討論的過程中,發現他輸入字元的代碼是這樣的:
1 scanf("%d",&z); 2 getchar(); 3 for(i=0;i<z;i++) 4 { 5 scanf("%s",&a[i]); 6 }
這裡對於字元的輸入,他使用了%s,而且不需要考慮回車的影響,這看起來是非常奇怪的;
事實上,由於後面是一個字元數組,當使用%s時,會以&a[i]為首地址輸入一個字元串 "X\0"(X為大寫字母),而在下一次輸入時,a[i+1]處儲存的'\0'就會被下一個字元串的第一個字元覆蓋,在這道題中不會產生影響。
在此程式中定義的字元數組是足夠大的,所以不會產生其他影響,當定義的數組大小為臨界值時,這種輸入方式就會因越界產生崩潰的可能,且當後面的變數為一個字元時,編譯器也不會報錯(CodeBlocks)。