zoukankan      html  css  js  c++  java
  • 倍增入门水题

    给定一个长度为n的数列A,然后进行若干次询问,每次给定一个整数T,求出最大的k,满足sigama(1<=i<=k)A[i]<=T。你的算法必须是在线的,且T小于这n个数的和。

    倍增思想,每次往后枚举2^n倍的数,看是否满足条件,不满足就只往后延伸2^(n-1),再次不满足就再往后除以2的个数延伸......

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int SIZE = 100010;
     4 int n,A[SIZE],s[SIZE],T;
     5 inline void dfs(int &p)
     6 {
     7     if(sum+s[k+p]-s[k]<=T)
     8     {
     9         sum +=s[k+p] - s[k];
    10         k += p;
    11         dfs(p<<1);
    12     }
    13     else dfs(p>>1);
    14     if(!p) break;
    15 }
    16 
    17 int main()
    18 {
    19     scanf("%d %d",&n,&p);
    20     for(int i = 1;i <= n;i++)
    21     {
    22         scanf("%d",&A[i]);
    23         s[i] = s[i-1] + A[i];
    24     }
    25     int p(1),k(0),sum(0);
    26     dfs(1);
    27     printf("%d",k);
    28     return 0;
    29 }

     

    G102的孤儿们都要好好的啊。
  • 相关阅读:
    c# 运算符 ? ??
    c# linq <未完>
    javasript this
    python3 闭包(一)
    dom 中的换行符
    (转)关于 awk 的 pattern(模式)
    linux note(1)
    python sqlite3
    python 特殊方法
    Go Example--锁
  • 原文地址:https://www.cnblogs.com/ve-2021/p/9515603.html
Copyright © 2011-2022 走看看