社区讨论

大样例没输出求条

P11290【MX-S6-T2】「KDOI-11」飞船参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m3n72tje
此快照首次捕获于
2024/11/18 23:42
去年
此快照最后确认于
2025/11/04 14:26
4 个月前
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <queue>
#include <stack>
#include <vector>
#include <iomanip>
using namespace std;
 
#define maxn 100005

inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return x*f;
}

int n,q;
unsigned long long er[100]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608,16777216,33554432,67108864,134217728,268435456,536870912,1073741824,2147483648,4294967296,8589934592,17179869184,34359738368,68719476736,137438953472,274877906944,549755813888,1099511627776,2199023255552,4398046511104,8796093022208,17592186044416,35184372088832,70368744177664,140737488355328,281474976710656,562949953421312,1125899906842624,2251799813685248,4503599627370496,9007199254740992,18014398509481984,36028797018963968,72057594037927936,144115188075855872,288230376151711744,576460752303423488,1152921504606846976};
unsigned long long san[100]={1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969,14348907,43046721,129140163,387420489,1162261467,3486784401,10460353203,31381059609,94143178827,282429536481,847288609443,2541865828329,7625597484987,22876792454961,68630377364883,205891132094649,617673396283947,1853020188851841,5559060566555523,16677181699666569,50031545098999707,150094635296999121,450283905890997363};
double dp[2][55][55];
int cnt2,cnt3;
int dis[maxn];
int t[maxn];
int x[maxn];
struct node{
	int val,w;
	int cid;
};
node qp[maxn];
double ans[maxn];

double distance(int dis1,int dis2,int c1,int c2){
	return 1.0*(dis1-dis2)/er[c1]/san[c2];	
}

bool cmp(node a,node b){
	return a.val<b.val;
}

int main(){
	n=read();q=read();
	int jjj=q;
	for(int i=0;i<=1;i++) 
	    for(int j=0;j<=44;j++) 
	        for(int k=0;k<=44;k++) 
	            dp[i][j][k]=0x3f3f3f3f;
	dp[0][0][0]=0;
	dp[1][0][0]=1;
	for(int i=1;i<=n;i++){
		dis[i]=read();t[i]=read();x[i]=read();
	}
	for(int i=1;i<=q;i++){
		qp[i].cid=i;
		qp[i].val=read();
		qp[i].w=lower_bound(dis+1,dis+1+n,qp[i].val)-dis-1;
	}
	sort(qp+1,qp+1+q,cmp);
	int cnt=1;
	while(qp[cnt].w==0){
		ans[qp[cnt].cid]=1;
		cnt++;
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=min(cnt2,i);j++){
			for(int k=0;k<=min(cnt3,i);k++){
				dp[i&1][j][k]=dp[(i-1)&1][j][k]+distance(dis[i],dis[i-1],j,k);
			}
		}
		if(x[i]==2){
			cnt2+=1;
			for(int j=0;j<=min(cnt2,i);j++){
				for(int k=0;k<=min(cnt3,i);k++){
					dp[i&1][j][k]=min(dp[i&1][j][k],dp[(i-1)&1][j-1][k]+t[i]+distance(dis[i],dis[i-1],j-1,k));
				}
			}
		}
		if(x[i]==3){
			cnt3+=1;
			for(int j=0;j<=min(cnt2,i);j++){
				for(int k=0;k<=min(cnt3,i);k++){
					dp[i&1][j][k]=min(dp[i&1][j][k],dp[(i-1)&1][j][k-1]+t[i]+distance(dis[i],dis[i-1],j,k-1));
				}
			}
		}
		if(x[i]==4){
			cnt2+=2;
			for(int j=0;j<=min(cnt2,i);j++){
				for(int k=0;k<=min(cnt3,i);k++){
					dp[i&1][j][k]=min(dp[i&1][j][k],dp[(i-1)&1][j-2][k]+t[i]+distance(dis[i],dis[i-1],j-2,k));
				}
			}	
		}
		while(i==qp[cnt].w){
			if(cnt>q) break;
			double an=0x3f3f3f3f;
			for(int j=0;j<=min(i,cnt2);j++){
				for(int k=0;k<=min(i,cnt3);k++){
					an=min(an,dp[i&1][j][k]+distance(qp[cnt].val,dis[i],j,k));
				}
			}
			ans[qp[cnt].cid]=an;
			//cout<<qp[cnt].cid<<" "<<an<<endl;
			cnt++;
		}
		if(cnt>q) break;
	}
	for(int i=1;i<=jjj;i++){
		printf("%f\n",ans[i]);
	}
	return 0;
}

回复

3 条回复,欢迎继续交流。

正在加载回复...