题意翻译
有 N N N个人参加了考试。考试完成后,在通过的人中,有 A A A个人去了第一个酒店聚会,有 B B B个人去了第二个酒店聚会,有 C C C个人同时去了两个酒店聚会。
容斥问题
公式: N − ( A + B − C ) N-(A+B-C) N−(A+B−C)
公式解释:总人数-(去了第一个酒店聚会的+去了第二个酒店聚会的-多算的(两个都去的))=都没有去的
不懂的见 容斥原理(百度百科)
细节
答案要大于0
//至少有一个,因为主角没有通过考试
A不能大于等于N
B不能大于等于N
C不能大于等于N
//总人数不能小于去了任意一个酒店聚会的(或都去的)
通过人数大于等于A
通过人数大于等于B
通过人数大于等于C
//显而易见
C不能大于A
C不能大于B
//都去的人数不能大于去了任意一个酒店聚会的人数
答案小于N
中和一下:
!(x>=n||y>=n||z>=n||z>x||z>y||sum<=0||n-sum<x||n-sum<y||n-sum<z||sum>n)
标程
#include<bits/stdc++.h>
using namespace std;
int x,y,z,n;
inline void read(register int &x){
x=0;register char c=getchar();register bool f=0;
while(c<'0'||c>'9'){if(c=='-')f=1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(f)x=-x;
}//快读
int main(){
read(x),read(y);
read(z),read(n);
int ans=q-n-m+x;
printf("%d\n",(x>=n||y>=n||z>=n||z>x||z>y||sum<=0||n-sum<x||n-sum<y||n-sum<z||sum>n)?-1:ans);
return 0;
}