cf 633 div2 c(貪欲)

C.パワード追加

ポータル(タイトルアドレス)http://codeforces.com/contest/1339/problem/C
ここに画像の説明を挿入

入力

3
4
1 7 6 5
5
1 2 3 4 5
2
0 -4

出力

2
0

3

ここに画像の説明を挿入

トピック:

この質問では、配列を増分に変換する必要があります。任意の配列要素を選択して2 ^(n-1)を1分ごとに増加させることができます。

アイデア

1.大量のデータがあるため、o(n)内でのみそれを解決する方法を見つけることができます。それは配列を走査することです。
2.次に、最初の要素から最初に繰り返します。質問を満たさないコンテンツが見つかった場合は、この時点で操作する必要があることを意味します(A [i] <a [i-1])このため、貪欲です作動しなければならない(比例シーケンスによると、最初の項は1、共通比率は2です。このシーケンスは、任意の数の正の整数を形成できます->次に、この[a]を[i]から[i-1]に貪欲に増やします)
3.配列要素が変更できる最大値は、経過時間ですtに対応する比例シーケンスの最初のnは合計したい
4.任意の配列要素、つまり線形操作で動作しているため、i-> ansを更新した後、次の要素の時間が十分でない場合は、ans(時間)を増やします。
5.時間のカウント方法?まず、表を作成し、比例シーケンスの最初のn項目の合計の1〜64の値を出力しました。
6.私のwhile操作を具体的に見て、それをマークします
。7. ansは時間です

ACコード

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll a[maxn];
ll time[maxn];
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    ll temp=1;
    for(int i=1; i<=60; i++)
    {
        temp*=2;
        time[i]=temp-1;
    }
   int t;
   cin>>t;
   while(t--)
   {
       int n;
       cin>>n;
       for(int i=1; i<=n; i++)cin>>a[i];
       ll pre=a[1];//前一个元素
       ll ans=0;
       ll temp=0;
       for(int i=2; i<=n; i++)
       {
           if(a[i]<pre)
           {
               temp=a[i]+time[ans];
               while(temp<pre)//对a【i】进行操作,直到它大于pre
               {
                   ans++;//加了后还小,才会循环,不够,就再加一秒
                   temp=a[i]+time[ans];
               }
           }
           else pre=a[i];
       }
       cout<<ans<<endl;
   }
    return 0;
}
オリジナルの記事を8件公開 いいね 8 訪問数75

おすすめ

転載: blog.csdn.net/qq_45377553/article/details/105495785