1. 程式人生 > 其它 >CF991A If at first you don't succeed... 題解

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

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;
}