第一题
【NOIP2011模拟7.29】铃仙·优昙华院·稻叶 (Standard IO)
Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits
Description
在幻想乡,铃仙·优昙华院·稻叶是从月球逃到永远亭的月兔。同样居住在永远亭的地球兔子因幡帝老是对铃仙恶作剧。某一天,铃仙终于决定要惩罚一下帝,不过首先得在迷途竹林里把帝抓住。永远亭的迷途竹林可以视为一个由N 个路口(编号1..N),M 条单向路连接的区域。开始时,帝在路口1,每一个单位时间,帝会以相同的概率走到相邻的路口或是停留在当前路口,一条路可以重复走,但是帝不会走回头路,也就是说如果帝从路口x 走到了路口y,在到过其他路口前,她一定不会从路口y 走回路口x。现在铃仙想知道,在T
秒钟以后,在哪个路口抓到帝的可能性最大。
Input
第1 行:3 个非负整数N, M, T。
第2..M+1 行:每行2 个整数u,v,表示存在一条从路口u 到路口v 的单向路。
Output
第1..N 行:一个实数,第i 行表示在路口i 抓到帝的概率,单位为%,保留3 位小数。
Sample Input
3 4 2
1 2
1 3
2 1
2 3
Sample Output
11.111
27.778
61.111
Data Constraint
Hint
【样例解释】
时刻0: 1(100%)
时刻1: 1(33.333%) 2(33.333%) 3(33.333%)
时刻2: 1(11.111%) 2(11.111%+16.667%) 3(33.333%+11.111%+16.667%)
在时刻2 时,只能从路口2 走向路口3,不可返回路口1。若时刻2 选择停留在路口2,时刻3 时仍然不可以从路口2 走回路口1,因为尚未走到过其他路口。
【数据范围】
对于30%的数据,N≤5,M≤10,T≤10
对于60%的数据,N≤10,M≤50,T≤500
对于100%的数据,N≤50,M≤2000,T≤500
【注意】
数据保证不会出现重边和自环、
题解:题意就是,在一个有向图中,每一秒都可以走向现在由所在点指出的边的点,但不可以走回上一秒所在的点。 就是概率dp嘛,设f[i][j][k]为在第k秒所在点为i,上个点为j的概率。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,T;
int a[60][60],Num=0,d[10000],head[1000];
double f[60][60][601];
struct hh
{
int next,to;
}l[2010];
void add(int x,int y)
{
Num++;
l[Num].next=head[x];
l[Num].to=y;
head[x]=Num;
}
int main()
{
freopen("in.txt","r",stdin);
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
cin>>n>>m>>T;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
a[x][y]=1;
d[x]++;
}
f[1][1][0]=1;
for(int t=0;t<T;t++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(f[i][j][t]>0)
{
bool flag=1;
if(a[i][j]) flag=0;
for(int p=head[i];p;p=l[p].next)
{
int v=l[p].to;
if(v==j) continue;
f[v][i][t+1]+=f[i][j][t]/(d[i]+flag);
}
f[i][j][t+1]+=f[i][j][t]/(d[i]+flag);
}
}
}
}
for(int i=1;i<=n;i++)
{
double ans=0;
for(int j=1;j<=n;j++)
{
ans+=f[i][j][T];
}
printf("%.3lf\n",ans*100);
}
return 0;
}
第二题
- 【NOIP2011模拟7.29】藤原妹红 (Standard IO)
Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits
Goto ProblemSet
Description
在幻想乡,藤原妹红是拥有不老不死能力的人类。虽然不喜欢与人们交流,妹红仍然保护着误入迷途竹林村民。由于妹红算得上是幻想乡最强的人类,对于她而言,迷途竹林的单向道路亦可以逆行。在妹红眼中,迷途竹林可以视为一个由N 个路口(编号1..N),M 条不同长度双向路连接的区域。妹红所在的红之自警队为了方便在迷途竹林中行动,绘制了一张特殊的迷途竹林地图,这张地图上只保留了N-1 条道路,这些道路保证了任意两个路口间有且仅有一条路径,并且满足所有保留的道路长度之和最小,我们称这些道路为『自警队道路』。现在妹红打算在其中一个连接有多条『自警队道路』的路口设立根据地,当去掉这个根据地所在路口后,就会出现某些路口间无法通过『自警队道路』相互连通的情况,我们认为这时仍然能够通过『自警队道路』连通的路口属于同一个『区域』。妹红希望最后每个『区域』的『自警队道路』总长尽可能平均,请计算出她应该选择哪一个路口作为根据地。
下例中红色的路口为妹红选择的根据地,实线边表示『自警队道路』,绿色虚线边表示非『自警队道路』,数字表示边权,『自警队道路』中相同颜色的实线边代表属于同一个『区域』:
(尽可能平均即权值最小,设每一块『区域』的路线总长为Length[i],平均路线长度为Avg=SUM{Length[i]}/区域数,权值d=Σ((Length[i]-Avg)^2))
Input
第1 行:2 个正整数N,M。
第2..M+1 行:每行2 个整数u,v 和1 个实数len,表示u,v 之间存在长度为len 的边。
Output
第1 行:1 个整数,最后选择的路口编号,存在多个可选路口时选择编号小的。
Sample Input
3 3
3 1 5
3 2 4
1 2 3
Sample Output
2
Data Constraint
Hint
【样例解释】
妹红的『固定道路』为(1,2)和(2,3)。只能选择2 作为根据地,产生的两个区域Length[i]分别为3 和4,所以方差为:(4-3.5)^2+(3-3.5)^2=0.5
【数据范围】
对于60%的数据:3≤N≤2,000,N-1≤M≤50,000
对于100%的数据:3≤N≤40,000,N-1≤M≤200,000
对于100%的数据:0 【注意】
保证不存在相同距离的线路,两个路口间可能出现多条路径,且任意点对间至少存在一条路径。
第三题
- 【NOIP2011模拟7.29】稗田阿求 (Standard IO)
Time Limits: 1000 ms Memory Limits: 131072 KB Detailed Limits
Goto ProblemSet
Description
在幻想乡,稗田乙女是负责书写《幻想乡缘起》的家族。由于需要代代相传关于幻想乡的记忆,稗田乙女采用了一些特殊的记录方式。对于相同重复的文字,稗田乙女会用一个数字来代替,然后用一个数列来表示一个段文字。比如1代表”A”,2代表”C”,那么{1,2}就
代表”AC”,{2,1,2}就代表”CAC”。不过由于年代过于久远,到阿求时已经是第九代稗田乙女,所以难免会出现错误。现在阿求有N 个数字(1..N)和N 个字符(‘A’..第N 个字母),以及一些以前传承下来的M 组文字段和对应的数列。每一组文字段和数列相互对应,文字的第
i 个字符对应着数列的第i 项。阿求想要知道怎样安排N 个数字和字符的对应关系,能够使组数尽可能多的文字段和数列组合满足该对应关系。数字和字符间一一对应,不会出现多对一或一对多的情况。
Input
第1 行:2 个正整数N, M。
第2..2*M+1 行:每2 行为一组,第1 行为文字段落,第2 行为数列。保证文字段落的字符数L 等于数列数字个数L,且均在1..N。文字段落只包含大写字母。
Output
第1 行:最多能够匹配的文字段落和数列组合数量。
Sample Input
3 3
ACCA
1 3 3 1
AAC
2 2 1
BCBC
3 1 3 1
Sample Output
2
Data Constraint
Hint
【样例解释】
当A=2,B=3,C=1 时第2、3 字符串和数列组合满足对应关系。
【数据范围】
对于60%的数据:1≤N≤10,1≤M≤20
对于100%的数据:1≤N≤26,1≤M≤60
对于100%的数据:1≤L≤100
【注意】
保证每一组文字段和数列组合均合法,在一组文字段和数列组合里面不会出现多个字符对一个数字,或是一个字符对多个数字的情况。