社区讨论

为毛线 enter[i+1]<=last[i+1] 而不是enter[i+1]<last[i+1]

P1315[NOIP 2011 提高组] 观光公交参与者 4已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mi7y1a3z
此快照首次捕获于
2025/11/21 05:28
4 个月前
此快照最后确认于
2025/11/21 05:28
4 个月前
查看原帖
#include #include using namespace std; const int maxn=10010; int n,m,k,d[maxn],t[maxn],a[maxn],b[maxn],last[maxn],enter[maxn],g[maxn],ans; int sum[maxn],cha[maxn]; void check(int k){ while(k>0){ g[n]=g[n-1]=n; for(int i=n-2;i>=1;i--){ if(enter[i+1]<=last[i+1]){///////为什么是小于等于 ……当bus进站时等于乘客最晚进站 时 //不也是可以影响到吗? g[i]=i+1; } else { g[i]=g[i+1]; } } int mm=-1,tt; for(int i=1;i<n;i++){ int pp=sum[g[i]]-sum[i]; if(pp>mm&&d[i]>0){ mm=pp; tt=i; } } ans-=mm; d[tt]--; for(int i=2;i<=n;i++){ enter[i]=max(enter[i-1],last[i-1])+d[i-1]; } k--; } } int main(){ scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n-1;i++){ scanf("%d",&d[i]); } for(int i=1;i<=m;i++){ scanf("%d%d%d",&t[i],&a[i],&b[i]); last[a[i]]=max(last[a[i]],t[i]); sum[b[i]]++; } for(int i=1;i<=n;i++){ sum[i]+=sum[i-1];//sum储存在到i站点下车的人数 } for(int i=2;i<=n;i++){ enter[i]=max(enter[i-1],last[i-1])+d[i-1]; } for(int i=1;i<=m;i++){ ans+=enter[b[i]]-t[i];//注意是减去t[i],而不是last[i]。 }
CPP
check(k);
printf("%d",ans);
return 0;
}

回复

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

正在加载回复...