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\n" , ans);

40     }

41     return 0;

42 }

 

你可能感兴趣的:(HDU)