题解
如果按照常规的暴力解法会TLE,如代码1所示。 优化方法1:相邻的两个凹槽如果上层凹槽宽度小于等于下层凹槽宽度,则下层凹槽的宽度无论是多少都对扔盘子没有影响,盘子只可能落到上层或者下层以下。所以可以在一开始就预处理使得这种情况下下层的宽度改为等于上层的宽度,使得整个井的宽度从上到下递减。
题目
问题 E: 扔盘子 ( Ver. I)
时间限制: 1 Sec 内存限制: 128 MB
提交: 21 解决: 6
[ 提交] [ 状态] [ 讨论版]
题目描述
有一口井,井的高度为N,每隔1 个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。
盘子有几种命运:1 、掉到井底。2 、被卡住。3 、落到别的盘子上方。
盘子的高度也是单位高度。给定井的宽度和每个盘子的宽度,求最终落到井内的盘子数量。
如图井和盘子信息如下:
井:5 6 4 3 6 2 3
盘子:2 3 5 2 4
最终有4 个盘子落在井内。
输入
第1 行:2 个数N, M中间用空格分隔,N为井的深度,M为盘子的数量( 1 <= N, M <= 50000 ) 。
第2 - N + 1 行,每行1 个数,对应井的宽度Wi ( 1 <= Wi <= 10 ^ 9 ) 。
第N + 2 - N + M + 1 行,每行1 个数,对应盘子的宽度Di ( 1 <= Di <= 10 ^ 9 )
输出
输出最终落到井内的盘子数量。
样例输入
7 5
5
6
4
3
6
2
3
2
3
5
2
4
样例输出
4
代码(TLE)
#include <iostream>
using namespace std;
int main ( void )
{
int i, num1, num2;
cin>> num1>> num2;
int a[ num1] , b[ num2] ;
for ( i= 0 ; i< num1; i++ )
cin>> a[ i] ;
for ( i= 0 ; i< num2; i++ )
cin>> b[ i] ;
int count = 0 ;
int temp = 0 ;
while ( num1 && temp!= num2)
{
for ( i= 0 ; i< num1; i++ )
{
if ( a[ i] < b[ temp] )
break ;
}
num1 = i- 1 ;
count++ ;
temp++ ;
}
cout<< count<< endl;
}
代码(AC)
#include <iostream>
using namespace std;
int main ( void )
{
int i, j, num1, num2;
cin>> num1>> num2;
int a[ num1] , b[ num2] ;
for ( i= 0 ; i< num1; i++ )
{
cin>> a[ i] ;
if ( i && a[ i] > a[ i- 1 ] )
a[ i] = a[ i- 1 ] ;
}
for ( i= 0 ; i< num2; i++ )
cin>> b[ i] ;
int count = 0 ;
for ( i= 0 ; i< num2; i++ )
{
while ( num1 && b[ i] > a[ num1- 1 ] )
num1-- ;
if ( num1)
{
num1-- ;
count++ ;
}
else
break ;
}
cout<< count<< endl;
}