CF1499C. Minimum Grid Path 贪心

题意: 从(0,0)-(n,n) 每一走变换方向,类似楼梯。每以条路有权值。第i条路的权值为 C i C_i Ci,规划路径,求最小 ∑ l e n i ∗ C i \sum len_i*C_i leniCi
题解:不妨考虑走i条路径走到(n,n) ,奇偶分类,让奇子列中最小的最长,偶子列最小的最长。很容易证明正确性。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
priority_queue<int,vector<int> ,greater<int>> q[2];
int a[N];
ll ans=0,sum[2];
int cas,n;
int main(){
	scanf("%d",&cas);
	while(cas--){
		while(!q[0].empty()) q[0].pop();
		while(!q[1].empty()) q[1].pop();
		
		scanf("%d",&n);
		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	//	;q[1].clear();
		q[1].push(a[1]);
		q[0].push(a[2]);
		ans=1ll*a[1]*n+1ll*a[2]*n;
		sum[1]=a[1];
		sum[0]=a[2];
		for(int i=3;i<=n;i++){
			q[(i&1)].push(a[i]);
			sum[(i&1)]+=a[i];
			int cnt1=0;int cnt0=0;
			if(i&1){
				cnt1=(i+1)>>1;
				cnt0=i-cnt1;
			}else{
				cnt0=i/2;
				cnt1=i-cnt0;
			}
		//	printf("%d %d\n",cnt0,cnt1); 
			ans=min(ans,sum[0]+sum[1]+1ll*(n-cnt0)*q[0].top()+1ll*(n-cnt1)*q[1].top());
			
			
		}
		cout<<ans<<endl;
		
	}
	
	
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值