求助帮改
  • 板块P1594 护卫队
  • 楼主Nagato_
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/6/16 00:15
  • 上次更新2024/6/16 11:10:40
查看原帖
求助帮改
310726
Nagato_楼主2024/6/16 00:15

求助大佬帮改代码,思路是区间DP,样例输出是78.0,谢谢

#include<bits/stdc++.h>
using namespace std;
long long ton,k,n,w[1010],s[1010],zz[1010][1010];
double t[1010],tt[1010][1010],f[1010][1010];
int main()
{
	cin>>ton>>k>>n;
	
	for(int i=1;i<=n;i++)
	{
		cin>>w[i]>>s[i];
		t[i] = 60.0*k/s[i];	
	}
	
	for(int i=1;i<=n;i++)
	{
		long long zq=0;
		
		tt[i][i]=t[i];
		zq=w[i];
		
		for(int j=i+1;j<=n;j++)
		{
			zq+=w[j];
			zz[i][j]=zq;
			
			tt[i][j] = max( t[j] , tt[i][j-1] );
		}
	}
	
//	for(int i=1;i<=n;i++)
//	{
//		for(int j=i;j<=n;j++)
//		{
//			//cout<<i<<" "<<j<<" "<<zz[i][j]<<" "<<tt[i][j]<<"\n";
//		}
//	}
	
	memset(f,0x7f,sizeof(f));
	
	for(int i=1;i<=n;i++)
		f[i][i] = t[i];
	
	for(int wi=2;wi<=n;wi++)
	{
		for(int i=1;i<=n-wi+1;i++)
		{
			int j=i+wi-1;
			
			if( zz[i][j] < ton )
			{
				f[i][j] = tt[i][j];
				continue;
			}
					
			
			for(int k=i;k<j;k++)
			{
				double q1=1e9,q2=1e9;
				
				if( zz[i][k] < ton )
					q1 = tt[i][k];
				
				if( zz[k+1][j] < ton )
					q2 = tt[k+1][j];
				
				//cout<<i<<" "<<j<<" "<<k<<" "<<q1<<" "<<q2<<" ";
				
				q1=min( f[i][k] , q1 );
				q2=min( f[k+1][j] , q2 );
				
				//cout<<q1<<" "<<q2<<"\n";
				
				f[i][j] = min( q1 + q2 , f[i][j] );
			}
		}
	}
	
//	for(int i=1;i<=n;i++)
//	{
//		for(int j=i;j<=n;j++)
//		{
//			cout<<i<<" "<<j<<" "<<f[i][j]<<"\n";
//		}
//	}
	
	int ans=f[1][n]*100;
	
	ans/=10;
	
	double ans2 = 1.0*ans/10;
	
	printf("%.1lf",ans2);
	
	return 0;	
}
2024/6/16 00:15
加载中...