18行のコードAC_HDU-4811ボール(数学、プッシュ式)

問題の説明

ジェニーはボールが好きです。彼はいくつかのボールを持っていて、テーブルの上にそれらを一列に並べたいと思っています。
これらの各ボールは、赤、黄、青の3つの色のいずれかになります。より正確には、ジェニーはRの赤いボール、Yの黄色のボール、Bの青いボールを持っています。彼はこれらのボールをテーブルに次々と任意の順序で置くことができます。ジェニーは新しいボールをテーブルに置くたびに、すでに置いたボールの列の真ん中(または一端)のどこかにそれを挿入できます。
さらに、ジェニーはテーブルにボールを置くたびに、いくつかのポイント(おそらくゼロ)を獲得します。ポイント数は次のように計算されます
。1.テーブルに置かれた最初のボールに対して、彼は0ポイントを獲得します。
2.ボールを列の一端に置いた場合、得点の数は、テーブルにすでに置かれた(つまり、現在のボールを予想する)異なる色の数と同じです。
3.ボールを2つのボールの間に置いた場合、得点の数は、現在配置されているボールの前のボールのさまざまな色の数に、現在のボールの後にあるボールのさまざまな色の数を加えた数になります。
ジェニーがボールをテーブルに置くことによって獲得できるポイントの最大合計はいくつですか?

入力

いくつかのテストケースがあります。EOFまで処理してください。
各テストケースには、単一のスペースで区切られた3つの整数R、Y、Bを含む1行のみが含まれます。入力のすべての数値は負ではなく、109を超えません。

出力

各テストケースについて、回答を1行で出力します。


本旨:

テーブルの行に、赤いボール、黄色のボール、青いボールが順番に並んでいます

1.最初のボールは0ポイントを獲得します。

2.ボールが列の両端に配置されている場合、スコアは、ボールの色を除くテーブル上の他の色のボールの数になります。たとえば、テーブルに黄色のボールが100個と赤いボールが100個あり、バレーボールの両端に青いボールが201回目に置かれた場合、スコアは+2になります。

3.ボールが2つのボールの間にある場合、スコアは、ボールの左側にある異なる色のボールの数+ボールの右側にある異なる色のボールの数です。たとえば、ボールの配置は次のとおりです:赤、青、赤、2つの青いボールの真ん中にフリーキックを配置し、スコアが+4であり、ボールの配置が赤、赤、青、黄色、赤、青、黄色で、4番目と5番目のボールの間フリーキックが解除され、スコアは+6になります。

したがって、最大スコアを配置する方法は、最初に各列の左端と右端に異なる色のボールを置き、次に各ボールを中央に置きます。左と右のボールの色タイプが3の場合、どの色が配置されていてもボールの場合、追加ポイントはすべて6です。

注:この文は非常に誤解を招くものです。
彼はクィールを獲得する の数に 異なる色 ボールの以前...
翻訳:スコアは、異なる色のボールの数ではなく、異なる色のボールの数に等しくなります!


質問を読んだ後に得られた結論は、次のとおりです。アルゴリズムの知識はありません。数式を導出することは問題です。

2 2 2を入力すると、出力0 + 1 + 2 + 3 + 4 + 5 = 15

3 3 3を入力すると、出力0 + 1 + 2 + 3 + 4 + 5 + 6 + 6 + 6 = 33

入力4 4 4の場合、出力0 + 1 + 2 + 3 + 4 + 5 + 6 + 6 + 6 + 6 + 6 + 6 = 51

2 1 5を入力すると、出力は0 + 1 + 2 + 3 + 4 + 5 + 5 + 5
2 + 1 + 2 = 5なので、0 + 1 + 2 + 3 + 4となります。次の4の数は5です。 。5-2 = 3、つまり5 + 5 + 5

1 1 5を入力すると、出力は0 + 1 + 2 + 3 + 4 + 4 + 4
1 + 1 + 2 = 4なので0 + 1 + 2 + 3となり、最後の3は4になります。5-2 = 3、したがって4 + 4 + 4

結論を導き出すのは簡単です。赤、黄、青のボールの数が2未満の場合は、0 + 1 + ...を押して増加させ、3つ以上に移動する場合は、増加後の+1の値で累積します。理解しなくてもかまいませんが、コードを見ればわかります

追加されたループハンドルから始めて、ガウスの式ACではなく、タイムアウトが表示されました


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    
    
	ios::sync_with_stdio(false);
	ll a, b, c; while(cin>>a>>b>>c) {
    
    
		ll sum1 = 0, sum2=0;
		if(a<=2) sum1+=a;
		else {
    
     sum1+=2; sum2+=(a-2); }
 		
		if(b<=2) sum1+=b;
		else {
    
     sum1+=2; sum2+=(b-2); }
		
		if(c<=2) sum1+=c;
		else {
    
     sum1+=2; sum2+=(c-2); }
		
		ll sum = 0;

//		for(int i = 0; i < sum1; i++) 	sum += i;
		sum += ((sum1-1)*sum1)/2;

//		for(int i = 0; i < sum2; i++)   sum += sum1;
		sum = sum+sum2*sum1;

		cout << sum << endl;
		
	}
return 0; }

おすすめ

転載: blog.csdn.net/weixin_43899069/article/details/108276947