https://www.luogu.org/problem/show?pid=2827//题目链接;
这道题的关键在于卡时间和初值,memset(d1,128,sizeof(d1))表示最小值。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<ctime>
using namespace std;
int my_comp(int a,int b)
{
if(a>b) return 1;
return 0;
}
int d1[9*1000000],d2[9*1000000],d3[9*1000000];
int main()
{
int n,m,q,u,v,t,i,j,t1,l1,l2,l3;
freopen("earthworm.in","r",stdin);
freopen("earthworm.ans","w",stdout);
memset(d1,128,sizeof(d1));
memset(d2,128,sizeof(d2));
memset(d3,128,sizeof(d3));
scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
l1=l2=l3=1;
for(i=1;i<=n;i++)
scanf("%d",&d1[i]);
t1=t;
sort(d1+1,d1+n+1,my_comp);
for(i=1;i<=m;i++)
{
long long x1,x2,c,q1=d1[l1],q2=d2[l2],q3=d3[l3];
if(q1>=q2&&q1>=q3) {x1=d1[l1];l1++;}
else
{
if(q2>=q1&&q2>=q3) {x1=d2[l2];l2++;}
else {x1=d3[l3];l3++;}
}
long long a=(x1+=(i-1)*q)*u/v;
d2[i]=a-i*q;
d3[i]=x1-a-i*q;
if(i%t==0) printf("%d ",x1);
}
printf("
");
for(i=1;i<=n+m;i++)
{
int x1,x2,c,q1=d1[l1],q2=d2[l2],q3=d3[l3];
if(q1>=q2&&q1>=q3) {x1=d1[l1];l1++;}
else
{
if(q2>=q1&&q2>=q3) {x1=d2[l2];l2++;}
else {x1=d3[l3];l3++;}
}
if(i%t==0) printf("%d ",x1+m*q);
}
fclose(stdin);
fclose(stdout);
return 0;
}
我被坑了好几次。QAQ
首先在x1*u/v时有可能爆int 类型。然后因为切开的蚯蚓都另外减去了增加值所以有可能是负值,当某一队蚯蚓取完时,0一定比负值大。于是指针就会卡到某个队列里啊。错是必然的。这个题让我惊醒了,真的,会打代码是一方面,重要的是分析啊,还有数据的范围和判断。希望以后不会犯这种错误了QAQ。