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\n", ans);
    }
    return 0;
}
时间: 2024-08-14 17:08:43

HDU4451Dressing(计数)的相关文章

1415.数的计数

1415. [NOIP2001]数的计数 ☆   输入文件:nums.in   输出文件:nums.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理 l·不作任何处理: 2·在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3·加上数后,继续按此规则进行处理,直到不能再立生自然数为止. [输入格式] 自然数n [输出格式] 满足

1024. 科学计数法 (20)

科学计数法是科学家用来表示很大或很小的数字的一种方便的方法,其满足正则表达式[+-][1-9]"."[0-9]+E[+-][0-9]+,即数字的整数部分只有1位,小数部分至少有1位,该数字及其指数部分的正负号即使对正数也必定明确给出. 现以科学计数法的格式给出实数A,请编写程序按普通数字表示法输出A,并保证所有有效位都被保留. 输入格式: 每个输入包含1个测试用例,即一个以科学计数法表示的实数A.该数字的存储长度不超过9999字节,且其指数的绝对值不超过9999. 输出格式: 对每个测

BZOJ_1016_[JSOI2008]_最小生成树计数_(dfs+乘法原理)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1016 给出一张图,其中具有相同权值的边的数目不超过10,求最小生成树的个数. 分析 生成树的计数有一个什么什么算法... 我真的企图研究了...但是智商捉急的我实在看不懂论文... 所以最后还是写了暴力... 当然暴力也要靠正确的姿势的. 首先来看一个结论: 同一张图的所有最小生成树中,边权值相同的边的数目是一定的. 也就是说,假如某一张图的某一棵最小生成树由边权值为1,1,2,2,2,3的

BZOJ 4517: [Sdoi2016]排列计数 错排+逆元

4517: [Sdoi2016]排列计数 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[i] 的值为 i,则称 i 是稳定的.序列恰好有 m 个数是稳定的 满足条件的序列可能很多,序列数对 10^9+7 取模. Input 第一行一个数 T,表示有 T 组数据. 接下来 T 行,每行两个整数 n.m. T=500000,n≤1000000,m≤1000000 Output 输出 T 行,每行一个数,表示

Storm实验 -- 单词计数4

在上一次单词计数的基础上做如下改动: 使用 自定义  分组策略,将首字母相同的单词发送给同一个task计数 自定义 CustomStreamGrouping package com.zhch.v4; import backtype.storm.generated.GlobalStreamId; import backtype.storm.grouping.CustomStreamGrouping; import backtype.storm.task.WorkerTopologyContext;

【BZOJ】【1016】【JSOI2008】最小生成树计数

Kruskal/并查集+枚举 唉我还是too naive,orz Hzwer 一开始我是想:最小生成树删掉一条边,再加上一条边仍是最小生成树,那么这两条边权值必须相等,但我也可以去掉两条权值为1和3的,再加上权值为2和2的,不也满足题意吗?事实上,如果这样的话……最小生成树应该是1和2,而不是1和3或2和2!!! 所以呢?所以对于一个图来说,最小生成树有几条边权为多少的边,都是固定的!所以我们可以做一遍Kruskal找出这些边权,以及每种边权出现的次数.然后,对于每种边权,比方说出现了$v_i$

实现类似shared_ptr的引用计数

13.27 定义使用引用计数版本的HasPtr #include<iostream> #include<string> #include<new> using namespace std; class HasPtr { public: HasPtr(const string &s=string()):ps(new string(s)),i(0),use(new size_t(1)) {cout<<"constructer"<

单词个数计数

#include<stdio.h> #include<string.h> #define ON 1 #define OFF 0 int main(void) {     int spoon, chopstick, sucker, cup;     spoon = chopstick = sucker = cup = OFF;     while((cup=getchar())!=EOF) {         if(isspace(cup)!=OFF) {//判断是否在单词外面   

Python:使用Counter进行计数统计

计数统计就是统计某一项出现的次数.实际应用中很多需求需要用到这个模型.比如测试样本中某一指出现的次数.日志分析中某一消息出现的频率等等'这种类似的需求有很多实现方法.下面就列举几条. (1)使用dict 看下面代码 #coding=utf-8 data = ['a','2',2,4,5,'2','b',4,7,'a',5,'d','a','z'] count_frq = dict() for one in data:      if one in count_frq:           cou