トピックリンク:「ブルーブリッジカップ」練習システム
分析:この質問の意味の説明に問題があるように感じます。タイトルには、クラスメートがオフィスに入るのに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人の生徒がメッセージを送信した時間の合計は、簡略化後、右側の合計値は固定されており、順序の変更によって変化しません。左側の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;
}