贪心么反正我写的是动态规划。设dp[i][j]表示将第i道菜扔到时间j的最小时间。注意要将t排序哦。memset(dp,0x3f,sizeof dp); for(int i1;i2*n;i){ dp[1][i]abs(t[1]-i); } for(int i2;in;i){//第i个人 for(int ji;j2*n;j){//时间j for(int ki-1;kj;k){//上一个人的时间 dp[i][j]min(dp[i][j],dp[i-1][k]abs(j-t[i])); //dp[i][j]等于上一个人在时间k的dp值加上这次的贡献值。 } } }初始化是好理解的注意时间要延续到2*n然后定义dp的时候要 int dp[N][2*N];然后统计答案。int ansINT_MAX; for(int i1;i2*n;i){ ansmin(ans,dp[n][i]); } printf(%lld\n,ans);完整代码(求赞)#includebits/stdc.h using namespace std; #define int long long const int N2e25; int T,n,t[N],dp[N][2*N];//表示将第i道菜扔到时间j的最小时间 signed main(){ scanf(%lld,T); while(T--){ scanf(%lld,n); for(int i1;in;i){ scanf(%lld,t[i]); } sort(t1,tn1); memset(dp,0x3f,sizeof dp); for(int i1;i2*n;i){ dp[1][i]abs(t[1]-i); } for(int i2;in;i){//第i个人 for(int ji;j2*n;j){//时间j for(int ki-1;kj;k){//上一个人的时间 dp[i][j]min(dp[i][j],dp[i-1][k]abs(j-t[i])); //dp[i][j]等于上一个人在时间k的dp值加上这次的贡献值。 } } } int ansINT_MAX; for(int i1;i2*n;i){ ansmin(ans,dp[n][i]); } printf(%lld\n,ans); } return ~(-1); }