zoukankan      html  css  js  c++  java
  • OpenJudge计算概论-比饭量【枚举法、信息数字化】

    /*======================================================================
    比饭量
    总时间限制: 1000ms 内存限制: 65536kB
    描述
    3个人比饭量,每人说了两句话:
    A说:B比我吃的多,C和我吃的一样多
    B说:A比我吃的多,A也比C吃的多
    C说:我比B吃得多,B比A吃的多。
    事实上,饭量和正确断言的个数是反序的关系。
    请编程按饭量的大小输出3个人的顺序。
    
    输入
    无输入
    输出
    按照饭量大小输出3人顺序,比如:
    ABC
    样例输入
    无
    样例输出
    无
    
    解析:这个题目在OpenJudge提交时,题目意思不清晰,应该按饭量从小到大的顺序输出字母 
    用三重for循环枚举所有可能的解
    对每一种可能的解计算每一个人正确断言的数量 
    然后把饭量、正确断言数量分别打包到数组(把人对应的编号一起封装)
    对两个数组进行排序(一个由大到小,另一个由小到大) 
    检测两个数组每一个元素对应的人名字是否一致,若所有人的名字一致,得到一个可行解。输出
    继续循环寻找下一个可行解 
    ========================================================================*/
     1 #include<iostream>
     2 using namespace std;
     3 struct person
     4 {
     5     int n;//饭量或者断言数量
     6     char name;//名字 
     7 };
     8 int main()
     9 {
    10     int a,b,c;//三者的范围都是1~3,这里把a、b、c的值看作他们的饭量(不一定要用1~3,只要能区分出三个数的大小就行了)
    11     //当然,也可以换一下思路,用a、b、c表示饭量排名
    12     int A,B,C;//表示断言正确的数量 
    13     struct person x[3],y[3],t;
    14     int i,j,flag;
    15     for(a=0;a<3;a++)
    16     {
    17         for(b=0;b<3;b++)
    18         {
    19             for(c=0;c<3;c++)
    20             {
    21                 A=(b>a)+(c==a);
    22                 B=(a>b)+(a>c);
    23                 C=(c>b)+(b>a);
    24                 /*假如三个人的饭量不会相等、三个人的断言正确数量也不会相等,
    25                 下面就判断a+A、b+B、c+C是否都相等,都等于3就行了。
    26                 但是这个题目,三个人饭量可能相等,断言正确数量也可能一样,必需用其他方式*/ 
    27                 //下面把a、b、c、A、B、C分别放到数组x、y当中。 然后对x、y数组进行排序
    28                 x[0].n=a;x[0].name='A';
    29                 x[1].n=b;x[1].name='B'; 
    30                 x[2].n=c;x[2].name='C';
    31                 y[0].n=A;y[0].name='A';
    32                 y[1].n=B;y[1].name='B'; 
    33                 y[2].n=C;y[2].name='C';
    34                 //对x数组按元素的饭量从大到小排序,对y数组按元素的断言正确数量从小到大排序
    35                 for(i=1;i<3;i++)
    36                 {
    37                     flag=1;
    38                     for(j=0;j<3-i;j++) 
    39                     {
    40                         if(x[j].n<x[j+1].n)
    41                         {
    42                             flag=0;
    43                             t=x[j];
    44                             x[j]=x[j+1];
    45                             x[j+1]=t;
    46                         }
    47                     }
    48                     if(flag) break; //if(flag==1) break;
    49                 }
    50                 
    51                 for(i=1;i<3;i++)
    52                 {
    53                     flag=1;
    54                     for(j=0;j<3-i;j++) 
    55                     {
    56                         if(y[j].n>y[j+1].n)
    57                         {
    58                             flag=0;
    59                             t=y[j];
    60                             y[j]=y[j+1];
    61                             y[j+1]=t;
    62                         }
    63                     }
    64                     if(flag) break; //if(flag==1) break;
    65                 }
    66                 //从头到尾检查x和y数组每一个元素对应的是否是同一个人 
    67                 for(i=0;i<3;i++)
    68                 {
    69                     if(x[i].name!=y[i].name) break;
    70                 }
    71                 if(i==3)
    72                 {//输出结果 
    73                     for(i=2;i>=0;i--)
    74                         cout<<x[i].name;
    75                     cout<<endl;
    76                 }
    77             }
    78         }
    79     }
    80     return 0;
    81 }
  • 相关阅读:
    CC学iOS杂记 001_Device
    低字节序和高字节序相互转换(Little Endian/Big Endian)
    wpf 控件复制 克隆
    压缩图片
    网络流转换为Byte数组
    JS屏蔽右键菜单,复制,粘帖xxxxx........
    记录详细错误信息
    Media Queries详解--转
    解决 asp.net 伪静态 IIS设置后 直正HTML无法显示的问题
    对C#泛型实例化对像--转
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/3467589.html
Copyright © 2011-2022 走看看