2021.3.19要約蓄積の第2週-欲張りアルゴリズム(続き)

ACMウィークリーサマリー-欲張りアルゴリズム


1.質問思考トレーニング1.問題に多くの制限があり、問題を解決するためのアイデアがない場合は、最初にいくつかの制限を削除してアイデアを見つけます
。2。上記のコードを完了した後、削除した制限を追加し
ます。3。コードを実行します。最適化(より良く、より速く、より短く)-stlなどを使用します。
注:欲張りアルゴリズムでは、ほとんどの場合、並べ替えのために並べ替える変数を見つけて、問題の要件に従って問題解決コードを完成させます。
2.トピック
ファーマージョンは、隣人のファーマーボブから、牛の鳴き声が大きすぎるとの騒音苦情を受けました。FJのN頭の牛(1 <= N <= 10,000)はすべて、長い一次元の牧草地のさまざまな場所で放牧しています。牛はとてもおしゃべりな動物です。牛のすべてのペアが同時に会話を続けます(したがって、すべての牛がN-1の他のすべての牛で同時にMOOします)。牛iが牛jでMOOを行う場合、jがMOOをまったく聞くことができるようにするには、このMOOの音量がiとjの間の距離に等しくなければなりません。FJがすべてのN *(N-1)同時MOOingセッションによって生成されるサウンドの総音量を計算するのを手伝ってください。
入力

1行目:N

2行目…N + 1:各牛の位置(0〜1,000,000,000の範囲)。

出力
場所1、5、3、2、および4に5頭の牛がいます。
サンプル入力

5 1 5 3 2 4

サンプル出力

40

ヒント
入力の詳細:

場所1、5、3、2、4には5頭の牛がいます。

出力の詳細:

1歳の牛は1+ 2 + 3 + 4 = 10、5歳の牛は4 + 3 + 2 + 1 = 10、3歳の牛
は2 + 1 + 1 + 2 = 6、2歳の牛は1 + 1+に貢献します2 + 3 = 7、4の牛は
3 + 2 + 1 + 1 = 7に貢献します。総量は(10 + 10 + 6 + 7 + 7)= 40です。

1.コンパイルエラー+ランタイムエラーエラーソリューションを送信します

#include <iostream>
#include<cmath>
using namespace std;
int main()
{
    
    
    int n;
    cin>>n;
    int x[n];
    for(int i=0;i<n;i++)
    {
    
    
        cin>>x[i];
    }
    int t=0,l=0;
    int i=0;
    int j=0;
    //应该都是对的
     if(n%2==0)
    {
    
    
        for(i=0;i<n-1;i++)
        {
    
    
        for(j=0;j<n;j++)
        {
    
    
            t+=abs(x[j]-x[i]);
        }
        }
        cout<<2*t;
    }
    else if(n%2!=0)
    {
    
    
        for(i=0;i<=(n-1)/2;i++)
        {
    
    
        for(j=0;j<n;j++)
        {
    
    
            t+=abs(x[j]-x[i]);
        }
        }
        for(int i=0;i<0;i++)
        {
    
    
            l+=abs(x[((n-1)/2)+1]-x[i]);
        }
        cout<<2*t+l;
    }


    return 0;
}

2.解決策
(1)元の理解:cinの読み取りが遅い、コードが不十分である、計算結果が正しくないなどのエラーがある可能性があります。つまり、問題を解決するという誤った考えです
。C言語を使用できます。 :sync_with_stdio(false)は、コードの前に追加できます。;、データタイプを変更し、より簡潔な問題解決のアイデアを見つけます。
(2)ランタイムエラーは、プログラムが途中で実行されるとプログラムがクラッシュすることを意味します。
いくつかの理由があり
ます
。①ゼロで除算する②配列の範囲外:int a [3]; a [10000000] = 10;
③ポインタの範囲外:int * p; p =(int *)malloc(5 * sizeof(int) ); *(p + 1000000)= 10;
④空き領域を使用:int * p; p =(int *)malloc(5 * sizeof(int));free§; * p = 10;
⑤配列が大きすぎます、スタックの範囲を超えて、スタックオーバーフローを引き起こします:int a [100000000];一般に、ojに関する質問はグローバル変数の配列に入れられ、 5が減少する可能性があります。
特定のリンク:
https
//blog.csdn.net/dreambyday/article/details/54880616 3.acコード
(1)c言語の実装

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int s[10005];
int main()
{
    
    
	int n,i,j;
	long long ans;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&s[i]);
	sort(s,s+n);
	ans=0;
	for(i=0;i<n;i++)
	{
    
    
		for(j=0;j<i;j++)
			ans+=s[i]-s[j];
		for(j=i+1;j<n;j++)
			ans+=s[j]-s[i];
	}
	printf("%lld\n",ans);
	return 0;
}

4.エラーコードは、C ++によって実装:時間制限を超過
リンク:
エラーの(1)理由https://blog.csdn.net/zhanshen112/article/details/83302382
(2)https://blog.csdn.net/qq_28301007 /記事/詳細/ 47363993

#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
 int s[10005];
int main()
{
    
      long long t;
    ios::sync_with_stdio(false);
    int i,j;
    int n;
    cin>>n;
    for(i=0;i<n;i++)
    {
    
    
        cin>>s[i];
    }
    sort(s,s+n);
    t=0;
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<i;j++)
        {
    
    
            t+=s[i]-s[j];
        }
        for(j=i+1;j<n;j++)
        {
    
    
             t+=s[j]-s[i];
        }
    }
    cout<<t<<endl;
    return 0;
}

3.c言語のコンパイル中に頻繁に発生するエラーの個人的な要約
https://blog.csdn.net/m0_53164390/article/details/115021914

おすすめ

転載: blog.csdn.net/m0_53164390/article/details/115018393