教练员考核题解

1.上升段

( one.cpp )

【问题描述】

输入n及n个正整数,输出上升段的数目,所谓上升段是指两个以上连续的严格单调上升序列。

【输入】

输入共二行

第一行只有一个正整数:n

第二行共有n个不超过10000的正整数,数与数之间用一个空格隔开

【输出】

输出只有一行且只有一个整数:按输入的顺序计算该序列上升段的数目

【输入样例】

5

534 657 435 556 587

【输出样例】

2

【样例说明】

534 657 是1个上升段

435 556587 是1个上升段

 

【数据规模】

   30% 的数据: 1 <= n <= 1 000

70% 的数据: 1 <= n <= 100 000

100% 的数据: 1 <= n <= 1 000 000


#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int MM=1000001;
int n;
int shu[MM];
int main(){
  cin >> n;
  shu[0]=0;
  memset(shu,0,sizeof(shu));
  for(int i=1;i<=n;i++)  cin >>  shu[i];
  int ans=0;
  
  int i=1; int j=1; 
  
  while( i<=j   ){ 
  	 if( (shu[j+1] > shu[j] )  && (j<=n) ) j++;
  	 else {
	    if( j-i>=1 )   {  ans++; }
	    j++; i = j ; if(i>n) break;
     }	   
  }
  cout << ans;
  
}


2.最大和

( two.cpp )

【问题描述】

输入n及n个绝对值不超过1000的整数,输出连续相邻数据长度不超过k的最大和s。

【输入】

输入共二行

第一行共有二个正整数:n k   ( 其中 1 <= k <=n )

第二行共有n个正整数,数与数之间有一个空格

【输出】

输出只有一行且只有一个整数:s的值

【输入样例】

6 3

1 -5 4 -23 -1

【输出样例】

5

【样例说明】

1 -5 4 -2 3-1

  这6个数据中,连续的3个数据4、-2、3的和:4+(-2)+3 = 5最大

【数据规模】

   50% 的数据: 1 <= n <= 100

80% 的数据: 1 <= n <= 1 000

100% 的数据: 1 <= n <= 1 000 000

估计要超时,如何解决?? 初步想法: 尺曲法

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int MM=1000001;
int n,k;
int shu[MM];
int sum[MM];

int main(){
  cin >> n >> k;
  
  shu[0]=0;
  for(int i=1;i<=n;i++)  cin >>  shu[i];
  int ans= - 999999999; 
  
  int i=0; int j=1; 
  sum[0]= 0;
  for(int i=1;i <=n;i++)
  	sum[ i] = sum[i-1] + shu[i];
  	
  
  for( int i=0;i<=n;i++) 
  	for(int len=1;len<=k && i+len<=n;len++)
  	  ans = max( ans,  sum[i+len] - sum[i]  );
  cout << ans;
  
}


3. 小型飞船

( three.cpp )

【问题描述】

有一批太空物资需要用小型飞船运送,每艘小型飞船每次最多只能运送总重量不超过w的两件物品。为了节约运费,一次性运送这批物资至少需多少艘小型飞船?

【输入】

输入共二行

第一行共有2个正整数:w n( 100 <= w <= 10 000 )

第二行共有n个不超过w的正整数:依次表示n件物品的重量,相邻两数间用一个空格隔开

【输出】

输出只有一行且只有一个正整数:最少的小型飞船数目

【输入样例】

100 9

90 20 20 30 50 60 70 80 90

【输出样例】

6

【样例说明】

这6艘小型飞船的载重量可以是:90,90,80+20,70+30,60+20,50。

 

【数据规模】      

50% 的数据:  1 <= n <= 100

80% 的数据:  1 <= n <= 100 000

100% 的数据:  1 <= n <= 1 000 000

4. 最接近的分数

( four.cpp )

【问题描述】

    给出一个正小数,找出分子与分母均不超过n的最简分数,使其最接近给出的小数。“最接近”是指在数轴上该分数距离给出的小数最近,如果这个分数不惟一,输出分子最小的一个。

【输入】

输入共二行:

第一行只有一个正整数:n

第二行只有一个正实数:x

【输出】

输出共二行:

第一行只有一个正整数:分子

第二行只有一个正整数:分母

【输入样例】

5

0.51

【输出样例】

1

2

【数据规模】      

50% 的数据: 1 <= n <= 1 000

80% 的数据: 1 <= n <= 100 000

100% 的数据: 1 <= n <= 10 000 000

 

#include <bits/stdc++.h>
#include <iostream>
using namespace std;
const int MM=1000001;
int n;
double  x;

int main(){
  cin >> n >>x;

  double jin=9999.0; int zi ; int mu;
  for(int i=1;i<=n;i++)  {
    //cout << "i is" << i<<endl;
    int L=1; int R=n;
    while( L<R ){
      // cout << L <<":::" << R;
       // cout<< endl;
        int middle = (L+R)/2;
        double  res = i*1.0/middle;
        if( res <= x)
            {
                R = middle;

            }
        else{
                L=middle+1;
            }
    }

 //cout << "over"<<endl<<"R is" << R <<endl;

   if( R<=n && fabs( i*1.0/R - x ) < jin ) { jin= fabs( i*1.0/R -x ); zi=i; mu=R; }

   if( R>=2 && fabs( i*1.0/(R-1) - x ) < jin) { jin= fabs( i*1.0/(R-1) - x ); zi=i; mu=R-1; }

  }

 //cout <<"result"<<endl;
  cout << zi<<endl;
  cout<<mu;

}



5.下落的小球

( five.cpp )

 

【问题描述】

有一棵二叉树,最大深度为D,且所有叶子的深度都相同。所有结点从上到下从左到右编号为1,2,3,...,2^D-1。在结点1处放一个小球,它会往下落。每个内结点上都有一个开关,初始全部关闭,当每次有小球落到一个开关上时,它的状态都会改变。当小球到达一个内结点时,如果该结点上的开关关闭,则往左走,否者往右走,直到走到叶子结点。

一些小球从结点1处依次开始下落,最后一个小球将会落到哪里呢?

 

【输入】

输入只有一行共有二个正整数:d k  (其中d为叶子深度,k为小球个数,1 <= k <= 2^(d-1) )

【输出】

输出只有一行且只有一个正整数:第k个小球最后所在的叶子编号

【输入样例】

16 12345

【输出样例】

36358

【数据规模】

   50% 的数据: 1 <= d <= 40  

80% 的数据: 1 <= d <= 60 

100% 的数据: 1 <= d <= 100




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值