第一次参加pat考试,结果很惨,只做了中间两道题,还有一个测试点错误,所以最终只得了不到50分。题目是甲级练习题的1148-1151。
考试时有些紧张,第一题第二题开始测试样例都运行不正确,但是调试程序考场的vs2013不能粘贴,还得一点点输上去。浪费了很多时间。
1、Werewolf - Simple Version
之前遇到这种题目较少,所以刚开始没什么思路。后来想到的方法是假设撒谎的两个人分别是i、j,然后遍历所有i、j,找出符合条件的。当时总共用了得有一个小时,但程序一直得不到正确答案,只好放弃。后来回到学校去调试程序发现问题出现在一个continue上,continue后面有一个操作需要完成但直接跳过了。但是按这个方法最后一个测试点错误。
其实这类题目问的是什么就假设什么,然后遍历所有可能性找出符合条件的就行。因此正确做法是直接假设两个狼人为i、j就行。
1 #include <iostream> 2 using namespace std; 3 4 int a[101], N; 5 int main() 6 { 7 int i, j, k, t; 8 cin >> N; 9 for (i = 1; i <= N; i++) cin >> a[i]; 10 for (i = 1; i <= N; i++) 11 { 12 for (j = i + 1; j <= N; j++) 13 { 14 bool b[101] = {}; 15 b[i] = b[j] = 1; 16 int lie1, lie2, cnt = 0; 17 for (k = 1; k <= N; k++) 18 { 19 if (a[k] > 0 && b[a[k]] || a[k] < 0 && !b[-a[k]]) 20 { 21 cnt++; 22 if (cnt == 1) lie1 = k; 23 if (cnt == 2) lie2 = k; 24 } 25 } 26 if (cnt == 2 && b[lie1] != b[lie2]) 27 { 28 printf("%d %d", i, j); 29 return 0; 30 } 31 } 32 } 33 printf("No Solution"); 34 return 0; 35 }