1006 概率
P[find(i)] = 1/6(P[i-1]+P[i-2]+P[i-3]+P[i-4]+P[i-5]+P[i-6]); //概率
E[find(i)] = 1/6(sum(P[i-6, i-1])+sum(E[i-6, i-1])); //期望
ans = sum(E[n, n+5]);
double P[N];
double E[N];
int fa[N];
void init(int n)
{
for(int i=0; i<=n; i++)
{
P[i] = 0;
E[i] = 0;
fa[i] = i;
}
P[0] = 1;
}
int find(int x)
{
if(x==fa[x]) return x;
return fa[x] = find(fa[x]);
}
int main()
{
int n, m, x, y;
while(scanf("%d%d", &n, &m), n+m)
{
init(n+7);
for(int i=1; i<=m; i++)
{
scanf("%d%d", &x, &y);
fa[x] = y;
}
for(int i=0; i<n; i++)
{
for(int j=1; j<=6; j++)
{
int tmp = find(i+j);
P[tmp] += P[i]/6.0;
E[tmp] += (E[i]+P[i])/6.0;
}
}
double ans = 0;
for(int i=0; i<6; i++)
ans += E[n+i];
printf("%.4f\n", ans);
}
return 0;
}
1001 乱搞
对X离线排序,对于每个X开一个set放Y。对于每个炸弹,二分X的区间,在区间内二分Y。 BFS
1004 暴力
我的算法是——枚举符号放的位置dfs , 然后枚举等号位置,Check。
string str;
int lis[20] , ans , n;
LL dp[20][20];
void check(int m){
for (int i = 1 ; i <= m ; ++i){
LL sumpre = 0 , sumnex = 0;
bool pre = true;
for (int j = 1 ; j <= m ; ++j){
if (pre) sumpre += dp[lis[j - 1] + 1 ][lis[j]];
else sumnex += dp[lis[j -1] + 1] [lis[j]];
if (i == j) pre= false;
}
if (pre) return;
sumnex += dp[lis[m] + 1 ][n];/*
if(sumpre == sumnex) {
printf("%I64d %I64d %d\n",sumpre , sumnex , i);
for (int k = 1 ; k <= m ; ++k){
printf("%d ",lis[k]);
}
printf("\n");
}*/
if (sumnex == sumpre && sumpre) ++ans;
}
}
void dfs(int x){
for (lis[x] = lis[x - 1 ] + 1 ; lis[x] < n ; ++lis[x]){
check(x);
dfs(x + 1);
}
return;
}
void init(){
for (int i = 1 ; i <= n ; ++i)
for (int j = i ; j <= n ; ++j){
dp[i][j] = 0;
for (int k = i ; k <= j ; ++k)
dp[i][j] = dp[i][j] * 10 + str[k - 1] - '0';
}
}
void solve(){
n = str.length();
init();
ans = 0;
lis[0] = 0;
dfs(1);
printf("%d\n",ans);
}
int main(){
while (cin >> str , str != "END") solve();
}
1005 模板题
1007 费用流