怨念啊,边做边辅导wy、福鸡,最后还剩点时间做这题,发现挺不错的。推出个很靠谱的式子,但是不懂怎么优化,最后快结束时敲个暴力,以为赛后能提交,结果结束后界面打不开了。贴下代码。
题意是,烧烤n串食物,给出n串食物的放入时间点s[i]和拿走时间点t[i],但是拿走的时候,认不出哪个是第i个食物,会等概率随机选一个。然后问你最后每个食物没被烤熟预计考得太熟的概率分别是多少,就是在t[i]前拿走和t[i]后拿走的概率。所有的时间点s、t都不相同。以下是暴力代码,n^2的,不懂对不对,感觉挺靠谱的。再想想怎么优化。
http://code-festival-2014-china-open.contest.atcoder.jp/submissions/415797
GOOGLE搜到原题了,都是这场的,略坑啊。
这题傻逼了,反着想就好做多了,概率就是累乘了。我这自作聪明正着做,一点都不能优化。
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
#include<set>
using namespace std;
const int N = 100005;
#define mp(x,y) make_pair(x,y)
typedef pair<int,int> per;
struct time_point
{
int t,flag,id;
}tp[N];
bool cmp(time_point x,time_point y)
{
return x.t<y.t;
}
struct fd
{
int s,t;
}food[N];
double und[N],sco[N],que_und[N],que_sco[N];
int enter_und[N],enter_sco[N],lev_und[N],lev_sco[N];
int main()
{
int n;
scanf("%d",&n);
int k=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&food[i].s,&food[i].t);
tp[k].t=food[i].s;
tp[k].flag=0;
tp[k].id=i;
k++;
tp[k].t=food[i].t;
tp[k].flag=1;
tp[k].id=i;
k++;
}
int p1=0,p2=0;
sort(tp,tp+k,cmp);
int cnt=0;
for(int i=0;i<k;i++)
{
if(tp[i].flag==0)
{
enter_und[tp[i].id]=p1;
cnt++;
}
else
{
lev_und[tp[i].id]=p1;
printf("p1:%d p2:%d cnt:%d i:%d \n",p1,p2,cnt,i);
que_und[p1++]=cnt;
que_sco[p2++]=cnt;
enter_sco[tp[i].id]=p2;
cnt--;
}
}
for(int i=0;i<n;i++)
{
printf("i:%d entund:%d levund:%d \n",i,enter_und[i],lev_und[i]);
und[i]=0.0;
for(int j=enter_und[i];j<lev_und[i];j++)
{
und[i]+=(1.0-und[i])*(1.0/que_und[j]);
}
}
for(int i=0;i<n;i++)
{
sco[i]=0.0;
double pre=und[i]+(1.0-und[i])*(1.0/que_und[lev_und[i]]);
for(int j=enter_sco[i];j<p2;j++)
{
printf("pre:%lf i:%d j:%d que_sco:%lf \n",pre,i,j,que_sco[j]);
sco[i]+=(1.0-pre)*(1.0/que_sco[j]);
pre+=(1.0-pre)*(1.0/que_sco[j]);
}
}
for(int i=0;i<n;i++)printf("%.9lf %.9lf\n",und[i],sco[i]);
return 0;
}