(第11回ブルーブリッジカップ決勝戦)H:回答(貪欲)

トピックリンク:「ブルーブリッジカップ」練習システム

 

分析:この質問の意味の説明に問題があるように感じます。タイトルには、クラスメートがオフィスに入るのにs秒の準備が必要であり、オフィスを出るのにe秒かかると書かれています。入社の準備には数秒かかりますが、前回はそうは言わなかったクラスメートがメッセージを送った後、退社する前に準備ができなかったので、正しい考えが思い浮かびませんでした。また、皆様のご注目を賜りますようお願い申し上げます。

以下は正しい思考分析です

質問に答える最適な順序が1、2、3 ...、nであると仮定すると、各番号はクラスメートを表します

その場合、クラスメートNo.1がメッセージを送信する瞬間はs1+a1です。

クラスメートNo.2がメッセージを送信する瞬間はs1+a1 + e1 + s2+a2です。

クラスメートNo.3がメッセージを送信する瞬間はs1+a1 + e1 + s2 + a2 + e2 + s3 + a3

……

クラスメートnがメッセージを送信する瞬間はs1+a1 + e1 + s2 + a2 + e2 + s3 + a3 + e3 + ... + s(n-1)+ a(n-1)+ e(n-1) + sn + an

n人の生徒がメッセージを送信した時間の合計は、\ sum_ {i = 1} ^ {n}((n-i + 1)*(si + ai))+ \ sum_ {i = 1} ^ {n}((ni)* ei)簡略化後\ sum_ {i = 1} ^ {n}((ni)*(si + ai + ei))+ \ sum_ {i = 1} ^ {n}(si + ai)、右側の合計値は固定されており、順序の変更によって変化しません。左側のsi + ai+eiも各数値に対してです。 。固定ですが、計算する回数はそれぞれ異なります。正面に近いほど計算回数が多くなります。したがって、s、a、eの3つの合計の数を少なくする必要があります。これはこのトピックのトピックです。貪欲な戦略

コードは次のとおりです。
 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
const int N=1300;
struct node{
	int s,a,e;
}p[N];
bool cmp(node a,node b)
{
	return (a.a+a.e+a.s)<(b.a+b.e+b.s);
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
		scanf("%d%d%d",&p[i].s,&p[i].a,&p[i].e);
	sort(p+1,p+n+1,cmp);
	long long ans=0;
	for(int i=1;i<=n;i++)
		ans+=(n-i)*(p[i].a+p[i].e+p[i].s)+p[i].a+p[i].s;
	cout<<ans;
	return 0;
}

おすすめ

転載: blog.csdn.net/AC__dream/article/details/124025236