感觉看起来是个大模拟
模拟每次操作,因为我们无法判断是d模式还是t模式
所以这里要将两次操作分开,然后在进行排序因为针对t或者d内部肯定越小越早变化
然而如何判断t与d就需要我们进行分别计算所需要的时间然后进行一一枚举
这里就像二路归并排序般一一进行选取
#include<iostream>
#include<algorithm>
using namespace std;
int a[10010],b[10010];
int n,res,q,p;
double l,t;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
char x;
int y;
cin>>x>>y;
if(x=='T')a[q++]=y;
else b[p++]=y;
}
sort(a,a+q);
sort(b,b+p);
int q1=0,p1=0,v=1;
while(q1<q&&p1<p)
{
double t1=a[q1]-t;
double t2=(b[p1]-l)*v;
if(t1<t2)
{
l+=(a[q1]-t)/v;
t=a[q1++];
v++;
}
else if(t1>t2)
{
t+=t2;
l=b[p1++];
v++;
}
else
{
t=a[q1++];
l=b[p1++];
v+=2;
}
}
//想想归并排序,若全从一路会导致另一路还有剩余
while(q1<q)
{
l+=(a[q1]-t)/v;
t=a[q1++];
v++;
}
while(p1<p)
{
t+=(b[p1]-l)*v;
l=b[p1++];
v++;
}
printf("%0.lf",t+(1000-l)*v);
return 0;
}