码迷,mamicode.com
首页 > 其他好文 > 详细

香料矿

时间:2016-08-20 20:36:29      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:

•题目描述

    Spore中用以代表经济的是一种叫做“香料矿”的矿物。香料矿有不同的种类,可以由它们的颜色轻易区分开来。
    火星怪兽已经控制了一些星系,并且在这些星系上建立了殖民地来开采香料矿。由于每个殖民地储存开采出来的香料的能力是有限的,在一次远征任务完成之后,火星怪兽发现他所有殖民地的香料库都满了,无法继续开采。为了不浪费时间,他决定把所有的香料都运回母星进行处理。
    火星怪兽的母星上有一座香料处理工厂,它有两台处理机,所以可以同时处理两批香料。但是不同的香料一起进入工厂是会出现危险的,所以这座工厂的两台处理机同一时刻处理的香料必须是相同种类的。
    现在有M种香料,共N批(M <= 10, N <= 100),每一批香料所的种类及其需要的处理时间都是已知的。对于每一批香料,你可以选择由两台机器的任何一台来处理。你的任务是帮助火星怪兽确定一个处理方案,以在最短的时间内处理完所有香料,好给他腾出一点时间去看最近更新的宅男动漫。

•输入格式

    输入数据包含了多个测试点。每一个测试点格式如下:
        第一行,两个由空格分开的整数,分别代表M、N。
        第二行,M个由空格隔开的字符串,长度均不超过10,为各种香料的名称。
        以下N行,每行一个整数Ti(0<Ti<=1000)以及一个字符串Si,分别代表第i批香料所需要的处理时间及其种类。
    输入文件以M=0、N=0结束。

•输出格式

    对于每个测试点,输出一行,仅包含一个整数,代表最少所需要的时间。

•输入样例

3 4
red blue yellow
2 red
3 blue
4 blue
6 red
0 0

•输出样例

10

首先,不同的种类之间不会相互影响,因为两台机器只能在同时加工相同种类的香料。

于是可以先将不同的种类分个类,我是直接每出现一个香料,都去搜一遍,它属于几号,当然直接排序也可以。

然后对于每种香料,我们知道如果,它的总时间t/2是不变的(这个总时间是指该类所有香料挨个挨个加工所需的总时间),然而如果一个机器刚好可以加工t/2(假设能整除)的时间

那么时间肯定是t/2,然而,一个机器可能加工的不会刚好是t/2,于是某台机器可能加工的是<=t/2的,当然时间就是另一台机器所用的时间,

于是我们可以定义f[i][j]表示在前i个香料中,时间不超过j的最少时间,所以每个香料都有选与不选两种情况,因为这个机器不选,肯定是另一个机器加工。

于是f[i][j]=max(f[i-1][j],f[i-1][j-t[j]]+t[j]),其实这里可以定义为bool类型的数组,当然你像我这样定义也可以,而我下面是用了滚动数组。

 1 #include <iostream>
 2 #include <fstream>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <string>
 6 #include <vector>
 7 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
 8 using namespace std;
 9 vector< vector <int> >kins(11);
10 int m,n,f[10003];
11 char kind[11][11];int tot[11],sc[11],sum[11];
12 
13 
14 int main(int argc, char *argv[]) {
15     memset(tot,-1,sizeof(tot));
16     memset(sc,-1,sizeof(sc));
17     while(scanf("%d%d",&m,&n)){
18         if(m==0&&n==0)break;
19         memset(sum,0,sizeof(sum));
20         memset(f,0,sizeof(f));
21         for(int x=1;x<=m;x++)cin>>kind[x];
22         for(int x=1;x<=n;x++){
23             int a;char b[11];
24             scanf("%d%s",&a,b);
25             for(int y=1;y<=m;y++){
26                 string c=b,d=kind[y];
27                 if(c!=d)continue;
28                 tot[y]++;sum[y]+=a;
29                 kins[y].push_back(a);
30                 break;
31             }    
32         }
33         int ans=0;
34          for(int x=1;x<=m;x++){
35              memset(f,0,sizeof(f));
36              for(int i=sc[x]+1;i<=tot[x];i++){
37                  for(int j=sum[x]/2;j>=kins[x][i];j--){    
38                     f[j]=max(f[j],f[j-kins[x][i]]+kins[x][i]);
39                  }
40              }
41             ans+=sum[x]-f[sum[x]/2];
42          }
43         for(int x=1;x<=m;x++)sc[x]=tot[x];
44          printf("%d\n",ans);
45     }
46     return 0;
47 
48 }

 

香料矿

标签:

原文地址:http://www.cnblogs.com/Ateisti/p/5791186.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!