zoukankan      html  css  js  c++  java
  • 好多鱼--全国模拟(一)

    [编程题] 好多鱼!
    时间限制:1秒
    空间限制:32768K
    牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:
    1、放进去的鱼是安全的,不会被其他鱼吃掉
    2、这条鱼放进去也不能吃掉其他鱼
    鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。现在知道新放入鱼的大小范围[minSize,maxSize](考虑鱼的大小都是整数表示),牛牛想知道有多少种大小的鱼可以放入这个鱼缸。 
    输入描述:
    输入数据包括3行. 第一行为新放入鱼的尺寸范围minSize,maxSize(1 ≤ minSize,maxSize ≤ 1000),以空格分隔。
    第二行为鱼缸里面已经有鱼的数量n(1 ≤ n ≤ 50)
    第三行为已经有的鱼的大小fishSize[i](1 ≤ fishSize[i] ≤ 1000),以空格分隔。
     
     
    输出描述:
    输出有多少种大小的鱼可以放入这个鱼缸。考虑鱼的大小都是整数表示
     
    输入例子:
    1 12 1 1
     
    输出例子:
    3
     
    解题思路:本题想法是采用set,池子里的每条鱼的2-10倍,与1/10-1/2的整数存入set中,然后对于给定鱼的大小范围,找是否在set中如果不在,count++
    注意事项:对于村1/10-1/2时,对于1/10,如果算出的为小数,则存入比它大的第一个整数
    对于1/2,算出为小数,存比它小的第一个整数即存整型的1/2*a[i]即可,所以只有1/10需要特别处理一下
     1 #include <iostream>
     2 #include <set>
     3 using namespace std;
     4  
     5 int main()
     6 {
     7     int minSize;
     8     int maxSize;
     9     while(cin>>minSize>>maxSize)
    10     {
    11         int num;
    12         cin>>num;
    13         int a[num];
    14         for(int i=0;i<num;i++)
    15         {
    16             cin>>a[i];
    17         }
    18         set<int> s;
    19         //存所有鱼的2-10倍值
    20         for(int i=0;i<num;i++)
    21         {
    22             for(int j=2*a[i];j<=10*a[i];j++)
    23             {
    24                 s.insert(j);
    25             }
    26         }
    27         //存所有鱼的1/10 - 1/2,例如a[i]=22存入的就是3-11
    28         //例如a[i] = 3 存入的为1
    29         //因此对于a[i]/10存入比它算的结果的小数大的最小整数
    30         //对于a[i]/2存入的是比它算的结果的小数小的最大的整数
    31         for(int i=0;i<num;i++)
    32         {
    33             float tmp =(a[i]*1.0)/10;
    34             int j = a[i]/10;
    35             if(tmp > j)
    36             {
    37                 j = j+1;
    38             }
    39             for(;j<=a[i]/2;j++)
    40             {
    41                 s.insert(j);
    42             }
    43         }
    44         int count = 0;
    45         set<int>::iterator it;
    46         //for(it = s.begin(); it != s.end(); it++)
    47         //{
    48         //    cout << *it << " ";
    49         //}
    50         //cout<<endl;
    51         for(int i= minSize;i<=maxSize;i++)
    52         {
    53             it = s.find(i);
    54             if(it == s.end())//没找到
    55             {
    56                 count++;
    57             }
    58  
    59  
    60         }
    61         cout<<count<<endl;
    62  
    63     }
    64 }
    网上参考代码思路:用标志位flag的值来存是否在范围内,如果在flag = false
    对于输入鱼的范围,判断它是否在池子中每条鱼2-10倍和1/10-1/2倍之间,如果在置false,且跳出与池子中鱼判断的循环。
     1 #include"stdio.h"
     2 int main()
     3 {
     4     int N;
     5     int minn,maxx;
     6     int ai[51];
     7     scanf("%d%d%d", &minn, &maxx,&N);
     8  
     9     for(int i=0; i<N; i++)
    10     {
    11         scanf("%d",&ai[i]);
    12     }
    13     int num=0;
    14     for(int i=minn; i<=maxx; i++)
    15     {
    16         bool sign=true;
    17         for(int j=0;j<N;j++)
    18         {
    19             if(i>=2*ai[j] && i<=10*ai[j])
    20             {
    21                 printf("%d ",i);
    22                 sign=false;
    23                 break;
    24             }
    25             else if(i>=1.0/10*ai[j] && i<=1.0/2*ai[j])
    26             {
    27                 printf("%d ",i);
    28                 sign=false;
    29                 break;
    30             }
    31         }
    32         if(sign)
    33          num++;
    34     }
    35     printf("%d
    ",num);
    36     return 0;
    37 }
  • 相关阅读:
    Jsp语法、指令及动作元素
    java之Cookie详解
    servlet请求转发、包含以及重定向
    20181114_特性
    20181114_反射_泛型反射
    20181112_反射基础_对象获取
    20181110_wait和async
    20181106_线程之异常_取消_变量_安全Lock
    20181105_线程之Task
    20181104_C#线程之Thread_ThreadPool_使用Thread实现回到和带参数的回调
  • 原文地址:https://www.cnblogs.com/qqky/p/7026949.html
Copyright © 2011-2022 走看看