HDU4451Dressing(计数)

2014-11-24 13:26:13 · 作者: · 浏览: 44

HDU4451Dressing(计数)

题目链接

题目大意:给你N件衣服, M条裤子, K双鞋子,现在有P个不合理的的搭配(衣服和裤子或者裤子和鞋子),要求不用P中不理的搭配方式来将衣服裤子鞋子三件搭配起来有多少种方案。

解题思路:本来只要给一个不合理的搭配方案的话,那么就是用总的搭配数目减掉2.但是可能会有衣服1 裤子1 ,裤子1 鞋子1这样的不合里搭配,那么衣服1 裤子1 鞋子1就多减了一次。因为这里都是由裤子来关联的,那么就将每条裤子不能搭配的衣服和鞋子的数目都记录下来,最后枚举一边裤子,一边累计(N - 和这条裤子不搭的衣服数目) (K - 和这条裤子不搭的鞋子)

代码:

#include 
   
     #include 
    
      const int maxn = 1e3 + 5; int vis1[maxn][maxn], vis2[maxn][maxn]; int c[maxn], s[maxn]; int main () { int N, M, K, P; int a, b; char str1[10], str2[10]; while (scanf ("%d%d%d", &N, &M, &K) && (N || M ||K)) { memset (vis1, 0, sizeof (vis1)); memset (vis2, 0, sizeof (vis2)); memset (c, 0, sizeof (c)); memset (s, 0, sizeof (s)); scanf ("%d", &P); for (int i = 0; i < P; i++) { scanf ("%s%d%s%d", str1, &a, str2, &b); if (str1[0] == 'c' && str2[0] == 'p') { if (!vis1[a][b]) { vis1[a][b] = 1; c[b]++; } } if (str1[0] == 'p' && str2[0] == 's') { if (!vis2[a][b]) { vis2[a][b] = 1; s[a]++; } } } int ans = 0; for (int i = 1; i <= M; i++) ans += (N - c[i]) * (K - s[i]); printf ("%d\n", ans); } return 0; }