题目链接:http://codeforces.com/problemset/problem/437/A
题目意思:给出四个选项A、B、C、D选项的内容描述,要求选出符合以下条件的一项。
(1)如果某个选项描述(排除前缀X.)的长度至少两倍短于其他选项,即 2*某个选项的长度 <= 其他选项的长度; 或者某个选项的长度至少两倍长于其他选项,即 其他选项的长度 <= 2*某个选项的长度,那么就认为该选项是great的。
(2)如果只有一个great 的选项,就输出该选项(A or B or C or D),否则输出C。
一开始对第二个条件有少少理解错了,被一个印度人hack了(乌冬兄教我看的),我刹时对他恨之入骨...哈哈哈,说笑,错了是件好事。接着死改都过不了hack,果断做B了。后来经乌冬兄的引导(其实他说的我已经知道的了),反正都是很感谢他。本来搞到很晚都过不了就关电脑了,关了电脑洗漱的时候顿时灵感出现,马上开回,终于过了^_^!!!
关键就是 choice 被认为是great时,多于一个是如何理解的!就是同时存在 2*某个选项的长度 <= 其他选项的长度 和 其他选项的长度 <= 2*某个选项的长度,此时great的choice就不少于一个了。只能输出C!还有就是如果都没有这两种情况的任意一种,也需要输出C!
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 100 + 10; 9 char a[maxn], b[maxn], c[maxn], d[maxn]; 10 11 struct node 12 { 13 int len; 14 char letter; 15 }choice[5]; 16 17 int cmp(node x, node y) 18 { 19 return x.len < y.len; 20 } 21 22 int main() 23 { 24 while (cin >> a >> b >> c >> d) 25 { 26 memset(choice, 0, sizeof(choice)); 27 choice[0].len = strlen(a) - 2; 28 choice[0].letter = 'A'; 29 choice[1].len = strlen(b) - 2; 30 choice[1].letter = 'B'; 31 choice[2].len = strlen(c) - 2; 32 choice[2].letter = 'C'; 33 choice[3].len = strlen(d) - 2; 34 choice[3].letter = 'D'; 35 sort(choice, choice+4, cmp); 36 37 if (2*choice[0].len <= choice[1].len) 38 { 39 if (choice[3].len >= 2*choice[2].len) 40 printf("C "); 41 else 42 printf("%c ", choice[0].letter); 43 } 44 else if (choice[3].len >= 2*choice[2].len) 45 { 46 if (2*choice[0].len <= choice[1].len) 47 printf("C "); 48 else 49 printf("%c ", choice[3].letter); 50 } 51 else 52 printf("C "); 53 } 54 return 0; 55 }