CF991A If at first you don't succeed... 题解

Content

一组人去考试,通过的人去甲、乙两个酒店里狂欢。已知有 \(A\) 个人去了甲酒店,\(B\) 个人去了乙酒店,\(C\) 个人同时去了这两家酒店。已知有 \(N\) 个人参加了考试,并且至少有一个人没有通过考试,问你如果数据没有错误的话,有多少人没有通过考试?如果数据有错误,输出 \(-1\)

数据范围:\(0\leqslant A,B,C,N\leqslant 100\)

Solution

大家应该都有听说过容斥原理吧。

没有?右转自行看百度百科去。

那么答案 \(ans\) 很显然了,就是 \(N-(A+B-C)\)

那么这道题目……还没有做完。

因为这题目要特判数据!这就很麻烦了。

——其实也不算麻烦。

要特判的也就这几个,而且比较显然,但是需要多想,这里我把特判都列出来一下:

特判 要特判的理由
\(ans>0\) 由题可知,至少会有一个人没有过,故答案必须要大于 \(0\)
\(ans\leqslant N\) 未通过的人数显然不能超过总人数。
\(A<N\) 理由同 \(ans>0\),故去酒店里面狂欢的人数不能大于等于 \(N\)
\(B<N\) 同上。
\(C<N\) 同上。
\(A+B-C\geqslant A\) 通过的人数显然不能够比去酒店里狂欢的人数还要少。
\(A+B-C\geqslant B\) 同上。
\(A+B-C\geqslant C\) 同上。
\(A\leqslant C\) 去一个酒店里狂欢的人数不可能比同时去两个酒店里狂欢的人数还要多。
\(B\leqslant C\) 同上。

那么这道题目就算做完了。

Code

三目运算符:条件 ? 语句A : 语句B;

相当于:

if(条件)	语句A;
else		语句B;

return 语句, 0; 相当于:

语句;
return 0;

#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int a, b, c, n, ans;

int main() {
	scanf("%d%d%d%d", &a, &b, &c, &n);
	ans = n - (a + b - c);
	return (ans > 0 && ans <= n && a < n && b < n && c < n && n - ans >= a && n - ans >= b && n - ans >= c && c <= a && c <= b) ? printf("%d", ans) : printf("-1"), 0;
}
posted @ 2021-12-23 20:21  Eason_AC  阅读(33)  评论(0)    收藏  举报