这是一道蓝桥杯国赛题 题目很简单主要是理解 s a e 本质上只是权重不同而已。
1.每位同学的s a的权重比e要大 1即对于整个发消息的时刻之和的计算 s 和 a要比e多计算一次。
2.每位同学的s a e的权重又比后面一位的同学大1,第一位同学s a要用n次 e要用n-1次,最后一位同学的s a要用1次 e要用0次。
3.贪心算法:要使发消息的时刻之和最小,即 要保证权重值最小。(所有同学中sn+an+e(n-1)的值最小的同学第一个答疑,同理除已选的第一个同学外s*(n-1)+a*(n-1)n+e*(n-2)值最小的同学第二个答疑。
#include "iostream"
using namespace std;
int main()
{
int n=0;
int s,a,e,sum=0;
int num[1000][2];
int b;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s>>a>>e;
num[i][0]=s+a; //每个同学的S和a权重相同,为了方便计算,直接加起来计算。
num[i][1]=e;
}
for(int i=n;i>0;i--)//选第n-i个同学
{
int min=2000000000;
int j;
for( j=0;j<n;j++) //选择权重*值最小的同学最先答疑
{
if(num[j][0]==0) //若该同学已选则跳过
continue;
if(num[j][0]*i+num[j][1]*(i-1)<min)
{
min=num[j][0]*i+num[j][1]*(i-1);
b=j; //记录
}
}
if(j==n) //选出第n-i个同学,将其带权时间加到总和中
{
sum+=min;
num[b][0]=0; //已选出的同学 标记 不再参与比较
//cout<<"b="<<b<<endl;
}
}
cout<<sum;
return 0;
}