HDU 4451 容斥原理

题目大意:

n件衣服,m条裤子,k双鞋子进行搭配

妈妈指明了哪些衣服和裤子不能搭配,哪些裤子和鞋子不能搭配,问最后有几种搭配方法

先假设都能搭配 n*m*k

每次遇到衣服和裤子不能搭的,就要减一次k,同时记录这个衣服和裤子出现的次数,避免以后重复减去的可以加回来

裤子和鞋子也是同样道理

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int N=1005;
 6 int cl[N][2] , pa[N][2] , sh[N][2];
 7 int n , m , k , p , a , b;
 8 char s1[20], s2[20];
 9 
10 int main()
11 {
12    // freopen("a.in" , "r" , stdin);
13     while(scanf("%d%d%d" , &n , &m , &k) ,n||m||k)
14     {
15         memset(cl , 0 ,sizeof(cl));
16         memset(pa , 0 ,sizeof(pa));
17         memset(sh , 0 ,sizeof(sh));
18 
19         int ans = n*m*k;
20         scanf("%d" , &p);
21         for(int i=0 ; i<p ; i++)
22         {
23             scanf("%s%d%s%d" , s1 , &a , s2 , &b);
24             if(s1[0] == 'c' && s2[0] == 'p'){
25                 ans -= k;
26                 ans += cl[a][1];
27                 ans += pa[b][1];
28                 cl[a][0]++;
29                 pa[b][0]++;
30             }
31             else if(s1[0] == 'p' && s2[0] == 's'){
32                 ans -= n;
33                 ans += pa[a][0];
34                 ans += sh[b][0];
35                 pa[a][1]++;
36                 sh[b][1]++;
37             }
38         }
39         printf("%d
" , ans);
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/CSU3901130321/p/4243841.html