HDU4451Dressing(计数)

HDU4451Dressing(计数)

题目链接

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

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

代码:

#include <cstdio>
#include <cstring>

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
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/blfshiye/p/4267484.html