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