您的位置:首页 > 其它

(数学)HDU 6045 Is Derek lying?

2017-07-27 19:35 381 查看
HDU-2017 多校训练赛2-1001-Is Derek lying?

题目网址: HDU 6045 Is Derek lying?

题意分析:

题意: Derek 和 Alfia 做N道选择题(三选一), 且每次成绩出来后, Derek都会得知, 然后 Alfia会问Derek他 和 她考了多少分, Derek会告诉她, 他考了X分, Alfia考了 Y分, 但是Derek是调皮的, 有可能欺骗Alfia.

现已知 Derek 和 Alfia 每道题的选项, 问Derek是否欺骗了Alfia(只要存在一种合理的情况使得Derek所说的成绩成立, 则Derek没说谎, 否则Derek说谎)

思路:

计数 Derek 和 Alfia 有多少个选择是不同的, 保存在 cnt中

根据 Derek的得分 X求出Y的合理区间.

Y的取值范围 为

max(X - cnt, 0) <= Y <= min(N - cnt, X) + min(cnt, N - X)

取值范围的得出:

最小值: 当Derek的得分X都尽量在Derek和Alfia 选择不同时获得的, 此时Y最小, 注意, 选项不同的数目多于得分X时, 表示 Derek的得分都是在和Alfia中选择不同时获得的, 而Derek和Alfia选择相同的都是错的,所以没得分.所以 Y的最小值是 max(X-cnt, 0)

最大值: 当Derek的得分X都尽量在Derek和Alfia 选择相同时获得的, 且Derek与Alfia选择不同时, 尽量都是 Alfia选择是正确的时, 此时 Y最大. 注意 Derek 和Alfia 选择相同的数目是 N-cnt, 若他们选择相同大于 X, 则X的得分都是在 他们选择相同时获得, 且此时 他们选择不同中的cnt个都是Alfia做对,此时, Alfia分数最大. 若X得分大于他们选择相同的数目N-cnt, 那么此时相同选择部分得分是 N-cnt, X没得分的其他部分 N-X都是Alfia得分.

代码:

#include <bits/stdc++.h>

using namespace std;

int main(int argc, char const *argv[])
{
int testn;
scanf("%d", &testn);

int n, x, y;
string D, A;
while (testn--)
{
scanf("%d %d %d", &n, &x, &y);
cin >> D;
cin >> A;
int cnt = 0;
for (int i = 0; i < n; ++i)
{
if (D[i] != A[i]) ++cnt;
}
int ymin = max(x - cnt, 0);
int ymax = min(n - cnt, x) + min(cnt, n - x);
// printf("%d %d\n", ymin, ymax);
if (y >= ymin && y <= ymax) printf("Not lying\n");
else printf("Lying\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息