社区讨论
为毛线 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]。
}
CPPcheck(k);
printf("%d",ans);
return 0;
}
回复
共 4 条回复,欢迎继续交流。
正在加载回复...