A.レベル統計
タイトル
レベルには、プレーヤーの試行回数と通関手続きの数があり、プレーヤーの$ n $時間のデータを時系列で提供して、これらのデータが妥当かどうかを判断します。
アイデア
- 通関手続きのみ
- 次の瞬間の試行回数は前の瞬間より少なくなりません
- 次の瞬間の通関の数は前の瞬間より少なくなりません
- 通関回数の増加ごとに、試行回数の増加を超えない
コード
#include <bits / stdc ++。h> using namespace std; void solve(){ int n; cin >> n; int p [n]、c [n]; for(int i = 0 ; i <n; i ++ ){ cin >> p [i] >> c [i]; } for(int i = 0 ; i <n; i ++ ){ if(c [i]> p [i]){ cout << " NO " << " \ n " ; ; } for(int i = 1 ; i <n; i ++ ){ if(p [i] <p [i- 1 ] || c [i] <c [i- 1 ] || c [i]-c [ i- 1 ]> p [i]-p [i- 1 ]){ cout << " NO " << " \ n " ; 戻る; } } cout << " YES " << " \ n " ; } int main(){ intt; cin >> t; while(t-- )solve(); }
B.中産階級
タイトル
$ n $の個人の富の値を知っているので、富の値を収集して均等に分配する人を選択し、最後に$ x $以上の富の値を持つ人々の数を尋ねることができます。
アイデア
降順で並べ替えて、余剰資産の価値を配分すると、初めて$ x $を集められない人の数が答えになります。
コード
#include <bits / stdc ++。h> using ll = long long ; 名前空間std を使用し ます。 void solve(){ int n、x; cin >> n >> x; int a [n]; for(int&i:a)cin >> i; sort(a、a + n、great < int > ()); ll extra = 0、ans = 0 ; for(int i:a){ if(i> = x){ extra + = i- x; ++ans; } else if(extra> = x- i){ extra- = x- i; ++ ans; } } cout << ans << " \ n " ; } int main(){ int t; cin >> t; while(t-- )solve(); }
C.モンスターの輪
タイトル
モンスターの輪があり、各モンスターのヘルスは$ a_i $であり、すべてのモンスターが$ 1 $回撃たれると$ 1 $のヘルスが失われ、モンスターが死亡すると、次のモンスターに$ b_i $のダメージを与えます。少なくともいくつのショットが必要か。
アイデア
最初に何回撃たなければならないか、つまり$ \ sum_ {i = 0} ^ {n-1} a [i] -b [i-1] $を見つけ、次にどのモンスターが開始点であるかを列挙し、合計を取ります最小値で十分です。
コード
#include <bits / stdc ++。h> #define pre(i)((i-1 + n)%n) using ll = long long ; 名前空間std を使用し ます。 void solve(){ int n; cin >> n; ll a [n]、b [n]; for(int i = 0 ; i <n; i ++ ){ cin >> a [i] >> b [i]; } ll sum = 0 ; for(int i = 0 ; i <n; i ++ ){ sum + = max(0LL、a [i]- -b [pre(i)]); } ll ans = 1e18; for(int i = 0 ; i <n; i ++ ){ if(a [i]> b [i]){ ans = min(ans、sum + b [i]); } else { ans = min(ans、sum + a [i]); } } cout << ans << " \ n " ; } int main(){ ios :: sync_with_stdio(false ); cin.tie(nullptr); int t; cin >> t; ながら(t-- )solve(); }