第一题:装载乘客
这道题就是需要设置一个变量用来存每次上车人数的和,如果超过了车的容量,就需要增加一辆车,然后将这个值设置为此时这个班的人数。具体如下代码:
#include <iostream>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int a[n];
int carSum = 1;
int temp = 0; //可表示此时一辆车上要坐多少人
for(int i=0;i<n;i++){
cin>>a[i];
temp += a[i];
if(temp>m)
{
carSum++;
temp = a[i];
}
}
cout<<carSum<<endl;
return 0;
}
第二题:股神
唉,这道题写出了前面几项,能看出一点规律,但自己的思维老是转不过弯,理解不了。后面看了看后面的答案参考,才明白了些。。
我们先列出前面的几项:
天数:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11….
钱数:1, 2, 1, 2, 3, 2, 3, 4, 5, 4, 5….
如果从跌的那天分隔开这些数据,我们可以看到:
天数:1, 2 | 3, 4, 5 | 6, 7, 8, 9 | 10, 11….
钱数:1, 2 | 1, 2, 3 | 2, 3, 4, 5 | 4, 5 ….
相差:0 ,0 | 2, 2, 2 | 4, 4, 4, 4 | 6, 6 ….
这样就可以看到,每下跌一次,后面的天数和钱数的差值加了2。设下跌次数为i,差值就是2i。
接下来如果能判断出i来,每日的钱数就可以求得了。
如何根据输入的天数n来得到i是多少。再观察一下序列,发现分隔的子序列后一个总比前一个多一个数,设每组子序列个数为m,则i=0时,m=2;i=1时,m=3.
这时,我们输入天数n,如输入5,需判断它是第几组里的。先判断是否在第一组,5-2=3>0不是在第一组,然后m++,因为到第二组有3个数了,3-3=0,所以在第二组中,因此最后的钱数就为:天数-差值2i=5-2*1=3.
写出代码如下:
#include <iostream>
using namespace std;
int getMoney(int n){
int i=0; //设置下跌的次数,也可以理解为第几组。
int m=2; //m为每组中的个数,第0组中有两个数。
int tmp = n;
while (tmp - m > 0) {
i++; //跳到下一组
tmp = tmp - m;
m++; //下一组个数也要跟着增加
}
return n - 2*i;
}
int main(){
int n;
while (cin>>n) {
cout<<getMoney(n)<<endl;
}
return 0;
}
想想自己还真弱,怎么增强啊。