C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

少なくともGのスコアを取得するために必要なスコアを見つけるためのC++プログラム


2つの配列pとcがあり、両方ともそれぞれD個の要素とG個の要素があるとします。コーディングコンテストで考えてみましょう。各問題のスコアは難易度に基づいています。問題p[i]のスコアは100iです。これらのp[1]+ ... + p [D]の問題は、コンテストに存在するすべての問題です。コーディングサイトのユーザーの番号はtotal_scoreです。ユーザーのtotal_scoreは、次の2つの要素の合計です。

  • 基本スコア :解決されたすべての問題のスコアの合計

  • ボーナス :ユーザーが100iのスコアですべての問題を解決すると、基本スコアとは別に完全なボーナスc[i]を獲得します。

アマルはコンテストの新人であり、問​​題を解決していません。彼の目的は、合計スコアがG以上になることです。この目的のために、少なくとも彼が解決する必要のある問題の数を見つける必要があります。

したがって、入力がG=500のような場合。 P =[3、5]; C =[500、800]の場合、出力は3

になります。

ステップ

これを解決するには、次の手順に従います-

D := size of p
mi := 10000
for initialize i := 0, when i < 1 << D, update (increase i by 1), do:
sum := 0
count := 0
at := 0
an array to store 10 bits b, initialize from bit value of i
for initialize j := 0, when j < D, update (increase j by 1), do:
   if jth bit in b is 1, then:
      count := p[j]
      sum := sum + ((j + 1) * 100 * p[j] + c[j]
   Otherwise
      at := j
if sum < G, then:
   d := (G - sum + (at + 1) * 100 - 1) / ((at + 1) * 100)
   if d <= p[at], then:
      sum := sum + (at + 1)
      count := count + d
if sum >= G, then:
   mi := minimum of mi and count
return mi

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
int solve(int G, vector<int> p, vector<int> c){
   int D = p.size();
   int mi = 10000;
   for (int i = 0; i < 1 << D; i++){
      int sum = 0;
      int count = 0;
      int at = 0;
      bitset<10> b(i);
      for (int j = 0; j < D; j++){
         if (b.test(j)){
            count += p.at(j);
            sum += (j + 1) * 100 * p.at(j) + c.at(j);
         } else {
            at = j;
         }
      }
      if (sum < G){
         int d = (G - sum + (at + 1) * 100 - 1) / ((at + 1) * 100);
         if (d <= p.at(at)){
            sum += (at + 1) * 100 * d;
            count += d;
         }
      }
      if (sum >= G) {
         mi = min(mi, count);
      }
   }
   return mi;
}
int main() {
   int G = 500;
   vector<int> P = { 3, 5 };
   vector<int> C = { 500, 800 };
   cout << solve(G, P, C) << endl;
}

入力

500, { 3, 5 }, { 500, 800 }

出力

3

  1. 与えられた条件に必要な操作の数を少なくともカウントするC++プログラム

    N個の要素を持つ配列Aがあるとします。各操作で、要素を選択し、それを1ずつ増減します。少なくとも次の条件を満たすために必要な操作の数を見つける必要があります- 1からnの範囲のすべてのiについて、第1項から第i項までの項の合計は0ではありません 1からn-1の範囲のすべてのiについて、第1項から第i項までの項の符号は、第1項から(i + 1)項までの項の合計の符号とは異なります。 したがって、入力がA =[1、-3、1、0]の場合、出力は4になります。これは、4つの操作で1、-2、2、-2のようなシーケンスを変換できるためです。最初の1、2、3、および4つの項の合計は、1、-

  2. グラフから減らすことができるスコアの最大量を見つけるためのC++プログラム

    n個の頂点とm個のエッジを持つ重み付きの無向グラフがあるとします。グラフのスコアは、グラフ内のすべてのエッジの重みの加算として定義されます。エッジの重みは負の値になる可能性があり、それらを削除するとグラフのスコアが増加します。グラフを接続したまま、グラフからエッジを削除して、グラフのスコアを最小にする必要があります。減らすことができるスコアの最大量を見つける必要があります。 グラフは配列edgesで与えられ、各要素は{weight、{vertex1、vertex2}}の形式です。 したがって、入力がn =5、m =6、edges ={{2、{1、2}}、{2、{1、3}}、{1、{2、3}