holstein解题报告

------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
  你需要给一头奶牛制定最优的喂养计划。
  有V种维他命,每天对于每种维他命,牛都有需要达到的指标;
  同时你有G种饲料,编号依次为1到G,每种维他命在每种饲料中所蕴含的量都会给你。
  请你从中选出N种饲料,在达到指标的前提下让N最小。
【数据范围】
  1<=V<=25
  1<=每种维他命的指标<=1000
  1<=G<=15
【输入格式】
  第一行是V,后面V行依次给出1号到V号维他命的指标;
  下面一行是G,后面G行依次是G种饲料,每行V个数,分别代表本饲料中各种维他命的含量。
【输出格式】
  仅一行,各数用空格隔开。
  第一个数是所需的饲料种数N,后面N个数依次是所选饲料的编号。
  注意,若有多种方案N相同,则仅输出字典序最小的一组方案。
【输入样例】
  4
  100 200 300 400
  3
  50 50 50 50
  200 300 200 300
  900 150 389 399
【输出样例】
  2 1 3
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
  这题做法是枚举。
  V种维他命,G份饲料,不妨考虑最大值G=15、V=25。每种饲料枚举取or不取,大约是300,000种情况;每种情况分别用来更新当前最优解,耗时大约不到400。如此可见,本题枚举时间大约在120,000,000,而枚举法常数很小,故而完全可以在1s内完成。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
  第二次提交AC。第一次犯了点细节错误,把G和V有点弄混的地方。
【吐槽】
  这题我严重被自己坑了。。
  一开始根本没往枚举法上想,觉得USACO Section2.1的题,怎么也应该有道难题了。。结果想了好长时间没想出做法来,然后一看——这G只有15!这不是完全可以枚举吗……

【再次吐槽】

  博文竟然有重名。。今后解题报告标题后面都加上我id,我就不行还有重名-.-

------------------------------------------------------------------------------------------------------------------------------------------------

【代码】

 /*
ID: icedrea1
PROB: holstein
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; int V,G;
int v[+],g[+][+];
bool now[+]; int r,s[+];
bool good[+]; bool better()
{
for(int k=;k<=G;++k)
{
if(now[k] && !good[k]) return true;
if(!now[k] && good[k]) return false;
}
}
void Try()
{
int cnt=,sum[+]={};
for(int k=;k<=G;++k)
if(now[k])
{
++cnt;
for(int i=;i<=V;++i) sum[i]+=g[k][i];
}
for(int i=;i<=V;++i)
if(sum[i]<v[i]) return; // 失败
if(cnt<r || cnt==r && better())
{
r=cnt;
for(int k=;k<=G;++k) good[k]=now[k];
}
} void go(int k) //前k组要不要已定
{
if(k==G) { Try(); return; }
++k; go(k);
now[k]=true; go(k); now[k]=false;
} int main()
{
ifstream in("holstein.in");
ofstream out("holstein.out"); in>>V;
for(int i=;i<=V;++i) in>>v[i];
in>>G;
for(int k=;k<=G;++k)
for(int i=;i<=V;++i) in>>g[k][i]; r=G+; go(); out<<r;
for(int k=;k<=G;++k)
if(good[k]) out<<" "<<k;
out<<endl; in.close();
out.close();
return ;
}

USACO Section2.1 Healthy Holsteins 解题报告 【icedream61】的更多相关文章

  1. USACO Section2.1 The Castle 解题报告

    castle解题报告 —— icedream61 博客园(转载请注明出处)--------------------------------------------------------------- ...

  2. USACO Section2.1 Ordered Fractions 解题报告

    frac1解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  3. USACO Section2.2 Preface Numbering 解题报告 【icedream61】

    preface解题报告----------------------------------------------------------------------------------------- ...

  4. USACO Section2.1 Hamming Codes 解题报告 【icedream61】

    hamming解题报告----------------------------------------------------------------------------------------- ...

  5. USACO Section2.3 Controlling Companies 解题报告 【icedream61】

    concom解题报告------------------------------------------------------------------------------------------ ...

  6. USACO Section2.3 Money Systems 解题报告 【icedream61】

    money解题报告------------------------------------------------------------------------------------------- ...

  7. USACO Section2.3 Zero Sum 解题报告 【icedream61】

    zerosum解题报告----------------------------------------------------------------------------------------- ...

  8. USACO Section2.3 Cow Pedigrees 解题报告 【icedream61】

    nocows解题报告------------------------------------------------------------------------------------------ ...

  9. USACO Section2.3 Longest Prefix 解题报告 【icedream61】

    prefix解题报告------------------------------------------------------------------------------------------ ...

随机推荐

  1. Js parsetInt() 字符串转换,只能转换字符串,数字开头的才会返回数值,否则为NaN,空字符串也返回NaN

    alert(parseInt('456lee')); //456,返回正数部分 alert(parseInt('lee456lee')); //NaN alert(parseInt('lee456le ...

  2. 使用g++ 编译C++程序

    在命令行下,编译C++程序 g++ main.cpp -o main.exe

  3. c++ priority_queue

    1.默认为大顶堆 #include <iostream> #include <queue> using namespace std; int main() { priority ...

  4. 关于tcp的keepalive

    先记录几个要点 只能用在面向连接的tcp中,对应对端的非正常关闭有效(对端服务器重启这种,也是正常关闭,FIN RST包都算) 只要是写入到缓冲区就认为OK,所以UDP不适合,所以如果有正常的网络交互 ...

  5. 重载<<操作符

    回头看我们之前的 rational.cpp,你满意了吗?反正我是觉得那些代码的可读性仍然欠佳:main 函数里边要多次调用 print 方法才能实现分数打印,酱紫不行! 如何通过重载 << ...

  6. Java中阻塞队列的使用

    http://blog.csdn.net/qq_35101189/article/details/56008342 在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如 ...

  7. Java-笔记1

    /* 对第一个java程序进行总结 1. java程序编写-编译-运行的过程 编写:我们将编写的java代码保存在以".java"结尾的源文件中 编译:使用javac.exe命令编 ...

  8. git中.gitignore 文件

    现在项目的根目录放了 .gitignore 文件,并且git远程仓库的项目根目录已经有了 logs文件夹. 由于每次本地运行项目,都会生成新的log文件,但是我并不想提交logs文件夹里面的内容,所以 ...

  9. face verification

    一直没怎么思考过人脸应用上cnn是怎么回事,也曾经想当然过.这两天看些文章,才明白思路. 在人脸verification上,cnn起到的是一个特征提取作用,通过cnn提取得到features,基于这些 ...

  10. 在VSCode中使用码云

    在VSCode中使用码云 一.SSH公钥 使用SSH公钥可以让你在你的电脑和码云通讯的时候使用安全连接(Git的Remote要使用SSH地址) 链接 https://gitee.com/profile ...