社区讨论
大样例没输出求条
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 条回复,欢迎继续交流。
正在加载回复...