题目描述
众所周知,小y是一个 “1+1” 都能回答错误的小可爱。因为这个,她没
少吃Z老师的头槌。
今天,Z老师来了场测验。小y看着卷子,一头雾水,什么都不会啊。
怎么办呢?幸好都是选择题。小y心想:“坊间传说,三长一短选最短,
三短一长选最长,参差不齐就选 C。我不如就这么试一试,兴许能少吃 9 下头
槌呢。”
可是,题目好多啊,题目好长啊,小y数都数不过来了 (“1 道,2 道,9道,9 道,9 道... 诶?刚刚数到几了?”),于是就请聪明的你来帮她选出答案啦。
注意,由于 “三长一短” 排在 “三短一长” 之前,所以优先判断是否满足 “三
长一短”,再判断是否满足 “三短一长”。当且仅当最短选项唯一时满足 “三长一
短”;同理,当且仅当最长选项唯一时满足 “三短一长”。其余情况都算作 “参差
不齐”。
方法一:
题目分析:首先我们要注意一下优先级的判断,先判断是否满足三长一短,然后是三短一长,其余都是参差不齐,我们可以先用两个变量去记录一下四个字符串中最长的和最短的长度是多少,然后再去遍历一下字符串,找出有多少个字符串的长度大于最短,有多少个字符串的长度小于最长,然后需要记录一下最短的长度的字符串的编号,然后还有最长的字符串的编号,最后再根据优先级判断一下属于哪一类就行。
#include <bits/stdc++.h> using namespace std; const int maxn = 100005; const int inf = 0x3f3f3f3f; struct node { string s; int len; } w[maxn]; int a[maxn]; int main() { int n; scanf("%d", &n); getchar(); while (n--) { int minn = inf, maxx = 0; for (int i = 1; i <= 4; ++i) { cin >> w[i].s; w[i].len = w[i].s.size(); maxx = max(maxx, w[i].len); minn = min(minn, w[i].len); } int cnt = 0, cnt1 = 0, flag = 0, flag1 = 0; for (int i = 1; i <= 4; ++i) { if (w[i].len > minn) ++cnt; if (w[i].len < maxx) ++cnt1; if (w[i].len == minn) flag = i; if (w[i].len == maxx) flag1 = i; } if (cnt == 3) printf("%c\n", 'A' + flag - 1); else if (cnt1 == 3) printf("%c\n", 'A' + flag1 - 1); else printf("C\n"); } }
方法二:
附上大佬的题解,虽然思路差不多,但还是有参考价值的~
#include <bits/stdc++.h> using namespace std; const int N = 1e6 + 10, INF = 0x3f3f3f3f; char a[N]; int s[4]; int ss[4]; int main() { int t; cin >> t; while (t--) { for (int i = 0; i < 4; i++) { scanf("%s", a); ss[i] = s[i] = strlen(a); } sort(s, s + 4); if (s[0] != s[1]) { for (int i = 0; i < 4; i++) { if (ss[i] == s[0]) { printf("%c\n", 'A' + i); break; } } continue; } else if (s[3] != s[2]) { for (int i = 0; i < 4; i++) { if (ss[i] == s[3]) { printf("%c\n", 'A' + i); break; } } continue; } else printf("C\n"); } return 0; }