http://poj.org/problem?id=1010

题意:给你n种邮票的价值,到0结束,这些邮票价值有可能相同,但是形状是不同的。

还有给你m个收藏家所需要收藏的邮票的总价格。到0结束。

每一个case包括两行,以输入eof为结束标志。

求最优解。其最优解也就是说相同价格可以收到更多的邮票,

如果邮票的种类相同,那么希望可以收到的张数更少越好,如果张数都相同的话

那么最好是最高价值的邮票的价值越高越高。

每个收藏家不能收超过4张邮票

如果不满足条件就输出none

如果有最高价值相同,张数相同,切种类数也相同的,则为输出tie。

其他的则输出 价值 (种类): 每一张邮票的价值。

思路:我是用一个结构体来记录每一种情况,用judge来判重。

用结构体来记录是哪几个价格的邮票(注意是价值相同的邮票不一定是同一张)。

记录这些中的最高价值。以及种类数。以及一共有几张邮票。

这道题的做法有很多种,我用的是直接暴搜,下次有时间在用搜索来做。

 #include <stdio.h>
#include <string.h>
#include <stdlib.h> #define size 100 int va[size],need[size]; int cmp(const void *a,const void *b)
{
return (*(int *)a)-(*(int *)b);
} struct as{
int kind; //记录种类,最大值,以及每张邮票的价值,邮票的张数。
int mx;
int wha[];
int num;

}s[]; int main()
{
while(scanf("%d",&va[])!=EOF)
{
int i=,j=,an=,q[],tmp,flog,ans;
bool judge[];
while(scanf("%d",&va[i]),va[i]) i++;
while(scanf("%d",&need[j]),need[j]) {
an=;
memset(judge,true,sizeof(judge));
memset(s,,sizeof(s));
for(int a=;a<=i;a++)
for(int b=;b<=i;b++)
for(int c=;c<=i;c++)
for(int d=;d<=i;d++)
{
ans=va[a]+va[b]+va[c]+va[d];
if(ans==need[j]){
q[]=a,q[]=b,q[]=c,q[]=d;
qsort(q,,sizeof(q[]),cmp);
if(judge[q[]*+q[]*+q[]*+q[]]) judge[q[]*+q[]*+q[]*+q[]]=false; //这个是我用来判重的,如果使用的几张都是相同的的话,那么可以直接跳过。
else continue;
s[an].wha[]=va[a];
s[an].wha[]=va[b];
s[an].wha[]=va[c];
s[an].wha[]=va[d];
qsort(s[an].wha,,sizeof(s[an].wha[]),cmp); //用来记录邮票的价值。
s[an].mx=s[an].wha[];
s[an].kind=;
s[an].num=;
if(q[]!=i) s[an].num++;
for(int l=;l>;l--){ //记录邮票的总的张数以及其种类,上面的q我是用来记录邮票的位置的,因为在不同位置上的邮票是不同的,即使价格有可能相同。
if(q[l]!=q[l-]&&q[l]!=i) s[an].kind++;
if(q[l]!=i) s[an].num++;
}
an++;
}
}
if(an==) printf("%d ---- none\n",need[j]); //下面的都是用来判断输出的。
else {
tmp=,flog=;
for(int m=;m<an;m++)
{
if(s[m].kind>s[tmp].kind) {
tmp=m;
flog=;
continue;
}
if(s[m].kind==s[tmp].kind){
if(s[m].num<s[tmp].num) {tmp=m;flog=;}
else{
if(s[m].num==s[tmp].num) {
if(s[m].mx>s[tmp].mx) {tmp=m;flog=;}
else if(s[m].mx==s[tmp].mx) flog++;
}
}
}
}
if(flog) printf("%d (%d): tie\n",need[j],s[tmp].kind);
else {
printf("%d (%d):",need[j],s[tmp].kind);
for(int m=;m<s[tmp].num;m++)
{
if(s[tmp].wha[m]==) {
s[tmp].num++;
}else printf(" %d",s[tmp].wha[m]);
}
printf("\n");
}
}
j++;
}
}
return ;
}

poj 1010的更多相关文章

  1. POJ 1010 题目翻译+题解

    题目实在是太难懂了,我翻译了一下... STAMPS Description Have you done any Philately lately? 你最近有没有集邮? You have been h ...

  2. 51nod 1010 只包含因子2 3 5的数 && poj - 1338 Ugly Numbers(打表)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1010 http://poj.org/problem?id=1338 首先 ...

  3. POJ题目排序的Java程序

    POJ 排序的思想就是根据选取范围的题目的totalSubmittedNumber和totalAcceptedNumber计算一个avgAcceptRate. 每一道题都有一个value,value ...

  4. POJ 题目分类(转载)

    Log 2016-3-21 网上找的POJ分类,来源已经不清楚了.百度能百度到一大把.贴一份在博客上,鞭策自己刷题,不能偷懒!! 初期: 一.基本算法: (1)枚举. (poj1753,poj2965 ...

  5. poj 3268(spfa)

    http://poj.org/problem?id=3268 对于这道题,我想说的就是日了狗了,什么鬼,定义的一个数值的前后顺序不同,一个就TLE,一个就A,还16MS. 感觉人生观都奔溃了,果然,题 ...

  6. POJ 2570(floyd)

    http://poj.org/problem?id=2570 题意:在海底有一些网络节点.每个节点之间都是通过光缆相连接的.不过这些光缆可能是不同公司的. 现在某个公司想从a点发送消息到b点,问哪个公 ...

  7. Divide and conquer:Telephone Lines(POJ 3662)

    电话线 题目大意:一堆电话线要你接,现在有N个接口,总线已经在1端,要你想办法接到N端去,电话公司发好心免费送你几段不用拉网线,剩下的费用等于剩余最长电话线的长度,要你求出最小的费用. 这一看又是一个 ...

  8. poj 2236:Wireless Network(并查集,提高题)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 16065   Accepted: 677 ...

  9. (转)POJ题目分类

    初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推. ...

随机推荐

  1. 百度文件上传webuploader上传文件,含文件大小、类型验证

    你的上传初始化文件upload_XXX.js中:(见红色字) // 初始化Web Uploader var allMaxSize = 10; var uploader = WebUploader.cr ...

  2. inet_ntoa、 inet_aton、inet_addr

    inet_addr()   简述:将一个点间隔地址转换成一个in_addr. #include <winsock.h> unsigned long PASCAL FAR inet_addr ...

  3. GOF业务场景的设计模式-----设计模式六大原则

    单一职责原则(Single Responsibility Principle) 定义:不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责. 问题由来:类T负责两个不同的职责:职责P1, ...

  4. JSON的parse()和stringfy()方法

    1.JSON.parse; 作用:将JavaScript对象表示法的JSON字符串转换为对象(字符串转对象). 语法:JSON.parse(text [, reviver]) text 必选. 一个有 ...

  5. AngularJS 使用$sce控制代码安全检查

    由于浏览器都有同源加载策略,不能加载不同域下的文件.也不能使用不合要求的协议比如file进行访问. 在angularJs中为了避免安全漏洞,一些ng-src或者ng-include都会进行安全校验,因 ...

  6. CSS 有关margin padding

  7. 【C语言入门教程】4.9 指向指针的指针

    指针变量可以指向另一个指针变量,这种操作并不是将一个指针变量所指向的内存地址传递给另一个指针变量,而是定义一种指向指针类型的指针变量,可将其称为双重指针.双重指针的定义形式为: 数据类型 **变量名: ...

  8. “RESTful架构”相关资料收藏

    [阮一峰]理解RESTful架构 [InfoQ]深入浅出REST 用于构建 RESTful Web 服务的多层架构 REST会是SOA的未来吗? Restful 与 SOA 的关系? 回答1: 注意r ...

  9. setValuesForKeysWithDictionary forUndefinedKey

    http://my.oschina.net/u/2407613/blog/524879 -(void)setValue:(id)value forUndefinedKey:(NSString *)ke ...

  10. servlet和http请求

    1.servlet servlet是和平台无关的服务器组件,可以交互式的来浏览和修改数据,生成动态的web内容.它运行于 servlet容器中2.servlet容器 servlet容器负责servle ...