好多鱼--全国模拟(一)

[编程题] 好多鱼!
时间限制: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\n",num);
36     return 0;
37 }

 

posted @ 2017-06-16 12:56  qqky  阅读(461)  评论(0编辑  收藏  举报