1044 Shopping in Mars (25分)/二分法
题目链接 一开始是用的简单模拟的方法做的,有两个测试点超时。于是把cin、cout改为了scanf、printf,可是仍然超时。主要是套了两层循环,时间复杂度为O(n^2)。 看了柳神代码,说要用二分法,于是我又想了想。可是还是每次把求sum的工作放在了函数里面,时间复杂度还是O(n^2)。然后才想到可以在输入时求从第一个数累计求和到当前的数,保存在数组中,这样方便于求子串的和。 用二分法的话这道题的时间复杂度应该是O(nlogn),快了很多。 AC代码 # include <iostream> # include <cstring> using namespace std ; int sum [ 100005 ] , an [ 100005 ] ; int min = 999999999 ; int solve ( int left , int right , int & m ) { int mid , L = left ; while ( left < right ) { mid = ( left + right ) / 2 ; if ( sum [ mid ] - sum [ L - 1 ] >= m ) right = mid ; else left = mid + 1 ; } return left ; } int main ( ) { int n , m ; scanf