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;
}