poj 1010

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

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

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

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

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

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

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

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

如果不满足条件就输出none

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

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

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

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

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

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

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 
 5 #define size 100
 6 
 7 int va[size],need[size];
 8 
 9 int cmp(const void *a,const void *b)
10 {
11     return (*(int *)a)-(*(int *)b);
12 }
13 
14 struct as{
15     int kind;          //记录种类,最大值,以及每张邮票的价值,邮票的张数。
16 int mx; 17 int wha[4]; 18 int num; 19
20 }s[100000]; 21 22 int main() 23 { 24 while(scanf("%d",&va[0])!=EOF) 25 { 26 int i=1,j=0,an=0,q[4],tmp,flog,ans; 27 bool judge[1000000]; 28 while(scanf("%d",&va[i]),va[i]) i++; 29 while(scanf("%d",&need[j]),need[j]) { 30 an=0; 31 memset(judge,true,sizeof(judge)); 32 memset(s,0,sizeof(s)); 33 for(int a=0;a<=i;a++) 34 for(int b=0;b<=i;b++) 35 for(int c=0;c<=i;c++) 36 for(int d=0;d<=i;d++) 37 { 38 ans=va[a]+va[b]+va[c]+va[d]; 39 if(ans==need[j]){ 40 q[0]=a,q[1]=b,q[2]=c,q[3]=d; 41 qsort(q,4,sizeof(q[0]),cmp); 42 if(judge[q[0]*1000+q[1]*100+q[2]*10+q[3]]) judge[q[0]*1000+q[1]*100+q[2]*10+q[3]]=false; //这个是我用来判重的,如果使用的几张都是相同的的话,那么可以直接跳过。 43 else continue; 44 s[an].wha[0]=va[a]; 45 s[an].wha[1]=va[b]; 46 s[an].wha[2]=va[c]; 47 s[an].wha[3]=va[d]; 48 qsort(s[an].wha,4,sizeof(s[an].wha[0]),cmp); //用来记录邮票的价值。 49 s[an].mx=s[an].wha[3]; 50 s[an].kind=1; 51 s[an].num=0; 52 if(q[0]!=i) s[an].num++; 53 for(int l=3;l>0;l--){ //记录邮票的总的张数以及其种类,上面的q我是用来记录邮票的位置的,因为在不同位置上的邮票是不同的,即使价格有可能相同。 54 if(q[l]!=q[l-1]&&q[l]!=i) s[an].kind++; 55 if(q[l]!=i) s[an].num++; 56 } 57 an++; 58 } 59 } 60 if(an==0) printf("%d ---- none\n",need[j]); //下面的都是用来判断输出的。 61 else { 62 tmp=0,flog=0; 63 for(int m=1;m<an;m++) 64 { 65 if(s[m].kind>s[tmp].kind) { 66 tmp=m; 67 flog=0; 68 continue; 69 } 70 if(s[m].kind==s[tmp].kind){ 71 if(s[m].num<s[tmp].num) {tmp=m;flog=0;} 72 else{ 73 if(s[m].num==s[tmp].num) { 74 if(s[m].mx>s[tmp].mx) {tmp=m;flog=0;} 75 else if(s[m].mx==s[tmp].mx) flog++; 76 } 77 } 78 } 79 } 80 if(flog) printf("%d (%d): tie\n",need[j],s[tmp].kind); 81 else { 82 printf("%d (%d):",need[j],s[tmp].kind); 83 for(int m=0;m<s[tmp].num;m++) 84 { 85 if(s[tmp].wha[m]==0) { 86 s[tmp].num++; 87 }else printf(" %d",s[tmp].wha[m]); 88 } 89 printf("\n"); 90 } 91 } 92 j++; 93 } 94 } 95 return 0; 96 }

 

转载于:https://www.cnblogs.com/Tree-dream/p/5705388.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值