zoukankan      html  css  js  c++  java
  • 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 ",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 ",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(" "); 90 } 91 } 92 j++; 93 } 94 } 95 return 0; 96 }
  • 相关阅读:
    Delphi取硬盘特征字
    Delphi学习中一点心得
    ring0 DOS路径转NT路径
    【code】ring0下的安全拷贝
    联合体在WinDBG中的表现形式
    【转】nmake下一些错误的解决办法
    【转】程序崩溃时自动记录minidump的c++类
    【转】 “指定的服务已标记为删除”
    【转】关于SSDT HOOK取消内存写保护的问题
    【转】内核安全字符函数
  • 原文地址:https://www.cnblogs.com/Tree-dream/p/5705388.html
Copyright © 2011-2022 走看看