100分,一个点WA了,求助
查看原帖
100分,一个点WA了,求助
1455973
xiaoli2013楼主2025/7/26 07:54
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int lu,pb,zpb;
};
int n;
node a[100010];
int sum[100010];
int luc[100010];
bool cmp1(node x,node y){
	return x.zpb >y.zpb ;
}
bool cmp2(node x,node y){
	if(a[1].lu >=x.lu &&a[1].lu >=y.lu ) return x.pb >y.pb ;
	else if(a[1].lu <x.lu &&a[1].lu>=y.lu ) return y.pb+a[1].lu*2+a[1].pb>x.lu*2+x.pb +a[1].pb ;
	else if(a[1].lu <y.lu &&a[1].lu>=x.lu ) return x.pb+a[1].lu*2+a[1].pb>y.lu*2+y.pb+a[1].pb ;
	else if(a[1].lu <x.lu &&a[1].lu <y.lu ) 
	return x.lu*2+x.pb >y.lu*2+y.pb ;
}
signed main() {
    cin>>n;
    for(int i=1;i<=n;i++){
	    cin>>a[i].lu ;	
	}
	for(int i=1;i<=n;i++){
		cin>>a[i].pb ;
	}
	for(int i=1;i<=n;i++){
		a[i].zpb =a[i].lu *2+a[i].pb ;
	}
	sort(a+1,a+n+1,cmp1);
	sort(a+2,a+n+1,cmp2);
	sum[1]=a[1].zpb ;
	luc[1]=a[1].lu ;
	cout<<a[1].zpb <<endl;
	//cout<<a[1].lu <<endl;
	for(int i=2;i<=n;i++){
		cout<<max(luc[i-1] ,a[i].lu )*2+a[i].pb +sum[i-1]-luc[i-1]*2 <<endl;
	 //   cout<<a[i].lu <<endl;
		sum[i]=max(luc[i-1] ,a[i].lu )*2+a[i].pb +sum[i-1]-luc[i-1]*2 ;
		luc[i]=max(luc[i-1] ,a[i].lu );
	}
	return 0;
}

我的思路跟你们好像不大一样,主要是通过排序,由于第一次销售什么都不用管只用管一家总的疲惫值,所以按总疲惫值从大到小排序,之后的n-1家,如果都比总疲惫值最高的那一家离入口近,比较疲惫值;如果一家比总疲惫值最高的那一家离入口近,一家比总疲惫值最高的那一家离入口远,则比较他们两家分别与疲惫值最高的那一家一起出售的总疲惫值。(感觉思路还是挺正确的,但就是A不了,我的同学跟我一样的情况,但思路也跟我不同)

2025/7/26 07:54
加载中...