好多鱼--全国模拟
Posted qqky
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了好多鱼--全国模拟相关的知识,希望对你有一定的参考价值。
[编程题] 好多鱼!
时间限制: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 }
以上是关于好多鱼--全国模拟的主要内容,如果未能解决你的问题,请参考以下文章