POJ 2436 USACO silver

题意:

总共最多有15种疾病

有n头牛,每头牛有di种疾病,分别用1-15之间的数字来表示

要求选择最多头牛 使他们的疾病种数不超过K

思路:

枚举状态,状态是当前有哪几种病,然后判断每头牛是否能选择即可

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn = 40000;

int cow[1005];
int tab[maxn];
int n,D,k;
void table(){
    for(int s = 0; s < (1<<15); s++){
        int cnt = 0;
        int tmp = s;
        while(tmp){
            if(tmp&1) cnt++;
            tmp = tmp>>1;
        }
        tab[s] = cnt;
    }
}
void init(){
    int di;
    memset(cow, 0, sizeof(cow));
    for(int i = 0; i < n; i++){
        scanf("%d",&di);
        int s = 0,tmp;
        while(di--){
            scanf("%d",&tmp);
            s |= (1<<(tmp-1));
        }
        cow[i] = s;
    }
}

void solve(){
    int ans = 0;
    for(int s = 0; s < (1<<D); s++){
        if(tab[s] > k) continue;
        int cnt = 0;
        for(int i = 0; i < n; i++){
            if(s == (s|cow[i]))
                cnt++;
        }
        ans = max(ans, cnt);
    }
    printf("%d\n",ans);
}
int main(){
    table();
    while(scanf("%d%d%d",&n,&D,&k) != EOF){
        init();
        solve();
    }
    return 0;
}
时间: 2024-11-08 05:41:25

POJ 2436 USACO silver的相关文章

(poj)3268 Silver Cow Party 最短路

Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects pairs of farms; road i re

usaco silver

大神们都在刷usaco,我也来水一水 1606: [Usaco2008 Dec]Hay For Sale 购买干草   裸背包 1607: [Usaco2008 Dec]Patting Heads 轻拍牛头 神转化,筛法 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐  LIS 1610: [Usaco2008 Feb]Line连线游戏 sb题 1611: [Usaco2008 Feb]Meteor Shower流星雨  BFS 1612: [Usaco200

「POJ 3268」Silver Cow Party

更好的阅读体验 Portal Portal1: POJ Portal2: Luogu Description One cow from each of N farms \((1 \le N \le 1000)\) conveniently numbered \(1 \cdots N\) is going to attend the big cow party to be held at farm #X \((1 \le X \le N)\). A total of \(M (1 \le M \l

poj 2436

题意: 给出n.d.k,n代表总共有几头牛,k代表有几种病毒,d代表最多几种病毒混合无害,接下来n行,每行最开始给出每头牛携带的病毒数,接下来给出具体是那些病毒.求最多几头牛放一起无害. Sample Input 6 3 2 0 1 1 1 2 1 3 2 2 1 2 2 1 分析: 将每头牛所携带的病毒种类用二进制表达出来,像101代表他携有第一和第三种病毒,将d种病毒中取n个病毒的方式用二进制表达出来.(可取的方式为区间[pow(2,k)-1,pow(2,d)]内所有2进制形式下有n个1).

POJ 2436 二进制枚举+位运算

题意:给出n头牛的得病的种类情况,一共有m种病,要求找出最多有K种病的牛的数目: 思路:二进制枚举(得病处为1,否则为0,比如得了2 1两种病,代号就是011(十进制就是3)),首先枚举出1的个数等于k的二进制数,然后跟所有的牛的代号一一比较,符合的           +1,找出其中和最大的:就是转换2进制麻烦,用位运算就好实现了,但是位运算不是很明白含义,明白了再补充: 知识点: 3 & 2 = 2,相同为1,不同为0, 011 & 010 = 010:(怎么利用的这个特点不明白):

USACO silver系列刷题记录

bzoj 1606: [Usaco2008 Dec]Hay For Sale 购买干草 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&

POJ 3261 USACO 2006 December Gold Milk Patterns

题目大意:给出一个字符串,求出出现过k次以上的最长的子串(可重叠). 思路:现弄出来sa数组和height数组,之后就是判断每个长度为k的height数组的区间中最小的数字的最大值了.为什么好多人都二分了?这只要单调队列扫一次就行了啊.. CODE: #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #def

POJ 2230 Watchcow &amp;&amp; USACO Watchcow 2005 January Silver (欧拉回路)

题意: Bessie 最近做了农场看守,他每天晚上的工作就是巡视农场并且保证没有坏人破坏农场.从谷仓出发去巡视,并且最终回到谷仓. Bessie 视力不是很好,不能像其他农场的看守一样,对农场的每一条连接不同场地的路走一遍就可以发现是不是有异常情况,他需要每条路都走两遍,并且这两边必须是不同的方向,因为他觉得自己应该不会两次都忽略农场中的异常情况. 每块地之间一定会由至少一条路相连.现在的任务就是帮他制定巡视路线.前提假设一定存在满足题意的路径. 输入: 第一行输入两个数N(2 <= N <=

USACO 2013 Nov Silver Pogo-Cow

最近因为闲的蛋疼(停课了),所以开始做一些 USACO 的银组题.被完虐啊 TAT 貌似 Pogo-Cow 这题是 2013 Nov Silver 唯一一道可说的题目? ? Pogo-Cow Description (大意是一条直线上有一些带权值的点,可以选择一个点作为出发点,选好一个前进方向(左或右)然后不断地向前跳到另一个点,得分为这个点的权值,要求每一跳的跳跃距离不小于前一跳,求能获得的最大得分) In an ill-conceived attempt to enhance the mob