noip 2016 换教室

第一个 完全自己想的期望+完全自己做的T3    并且  +1遍AC

Description:

luogu 换教室

Solution:

一看是一道期望题。

再一看,发现,v<=300,n,m<=2000有点意思。

大概复杂度n^2确定。

有一张图?任意两点间最短路?300就是floyd的提示嘛!!

预处理floyd确定。

发现,阶段比较明显,第i个阶段

一看就是一道期望dp题了。

dp状态:显然要记录第i阶段,显然要知道用了几个申请。恰好n方开的下。

可以设dp[i][j],表示前i阶段,包括这个阶段用了j个申请,期望值的最小值。

但是,不知道可能会在哪里,根本无法转移。

就设dp[i][j][0/1]表示,前i阶段,包括这个阶段用了j个申请,这一次有没有用申请。(仅有没有,过不过不知道。)

这样就可以转移了。

因为,知道了在哪里。

如果上一次没有用,就在c[i-1],否则一定概率在d[i-1]一定概率在 c[i-1]

转移的时候,当前是0,1同理处理一下概率即可。

注意,本质上,dp的转移思想还是,从上一个状态选择一个方案,算出这个转移的代价,取最小的转移过来。

所以,min肯定是在外面的。

至于期望的转移是否正确,就审查一下是否所有的情况概率和是1就好啦~!

Code:

#include<bits/stdc++.h>
using namespace std;
const int N=2000+3;
const int M=300+3;
const int inf=0x3f3f3f3f;
const double big=1000000007.00;
int dis[M][M];
int c[N],d[N];
double f[N][N][2];
double p[N];
int n,m,v,e;
int main()
{
    scanf("%d%d%d%d",&n,&m,&v,&e);
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    for(int i=1;i<=n;i++) scanf("%d",&d[i]);
    for(int i=1;i<=n;i++) scanf("%lf",&p[i]);
    int x,y,z;
    memset(dis,inf,sizeof dis);
    for(int i=1;i<=e;i++){
        scanf("%d%d%d",&x,&y,&z);
        if(x==y) continue;
        dis[x][y]=min(dis[x][y],z);
        dis[y][x]=dis[x][y];
    }
    for(int k=1;k<=v;k++){
      dis[k][k]=0;
      for(int i=1;i<=v;i++)
        for(int j=1;j<=v;j++){
            dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
        }
    }

    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++)
         f[i][j][0]=f[i][j][1]=big;
    }

    f[1][0][0]=0.0;
    f[1][1][1]=0.0;

    for(int i=2;i<=n;i++){
        for(int j=0;j<=min(i,m);j++){
            f[i][j][0]=min(f[i-1][j][0]+dis[c[i-1]][c[i]],
                        f[i-1][j][1]+p[i-1]*dis[d[i-1]][c[i]]+(1.00-p[i-1])*dis[c[i-1]][c[i]]); 

            if(j>=1)
            f[i][j][1]=min(

            (1.00-p[i])*(f[i-1][j-1][0]+dis[c[i-1]][c[i]])+
            p[i]*(f[i-1][j-1][0]+dis[c[i-1]][d[i]]),

            (1.00-p[i])*(f[i-1][j-1][1]+p[i-1]*dis[d[i-1]][c[i]]+(1.00-p[i-1])*dis[c[i-1]][c[i]])+
            p[i]*(f[i-1][j-1][1]+p[i-1]*dis[d[i-1]][d[i]]+(1.00-p[i-1])*dis[c[i-1]][d[i]])

            );

        }
    }
    double ans=big;
    for(int j=0;j<=m;j++){
        ans=min(ans,min(f[n][j][0],f[n][j][1]));
    }
    printf("%.2lf",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/Miracevin/p/9547406.html

时间: 2024-08-04 05:15:34

noip 2016 换教室的相关文章

[BZOJ 4720][NOIP 2016] 换教室

记得某dalao立了"联赛要是考概率期望我直播吃键盘"的$flag$然后就有了这道题233333 4720: [Noip2016]换教室 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 879  Solved: 461[Submit][Status][Discuss] Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上. 在第i(1≤i≤n

Noip 2016 Day 1 &amp; Day 2

Day 1 >>> T1 >> 水题直接模拟AC: 考察三个知识点:1.你能不能编程 2.你会不会取模 3.你脑子抽不抽 然而第一次评测还是90,因为当模运算时 " end == 0 " 时需要将 end 改成 n: 代码: 1 #include <bits/stdc++.h> 2 3 const int N = 1e5 + 5 ; 4 5 int n , k , x , y , end ; 6 7 struct node { 8 int id

BZOJ 4720 [Noip2016]换教室

4720: [Noip2016]换教室 Description 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程.在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室ci上课,而另一节课程在教室di进行.在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出申请.若申请通过,学生就可以在第i个时间段去教室

Noip 2016 Day1 题解

老师让我们刷历年真题, 然后漫不经心的说了一句:“你们就先做做noip2016 day1 吧” ...... 我还能说什么,,,,,老师你这是明摆着伤害我们啊2333333333 预计分数:100+25+24 实际分数:100+25+12 T1:玩具谜题 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外.如下图: 这时singer告诉小南一个谜題: “眼镜藏在我左数第3个玩具小

NOIP 2016 迟来的满贯

17-03-22,雨 17-03-22,一个特别重要的日子 在这一天,本蒻攻克了NOIP 2016最难的一题,D1T2--天天爱跑步 实现了NOIP 2016的AK! YAYAYAYAYAYAY 自然遭到了众巨神的膜拜--他们不屑于做这种弱菜才做的题目--RP又掉了 17-03-22于福州

noip 2016 天天爱跑步

描述 小C同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个游戏的地图可以看作一棵包含n个结点和n - 1条边的树,每条边连接两个结点,且任意两个结点存在一条路径互相可达.树上结点编号为从1到n的连续正整数. 现在有m个玩家,第i个玩家的起点为Si,终点为Ti.每天打卡任务开始时,所有玩家 在第0秒 同时从 自己的起点 出发,以 每秒跑一条边 的速度,不间断地沿着最短路径向着 自己的终点 跑去,

[NOIP2016]换教室 D1 T3 Floyed+期望DP

[NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 牛牛预先被安排在教室 ci上课, 而另一节课程在教室 di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出中情.若申请通过,学生

[NOIP2016]换教室 题解(奇怪的三种状态)

2558. [NOIP2016]换教室 [题目描述] 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第i(1<i<n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室ci上课,而另一节课程在教室di进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程.如果学生想更换第i节课程的教室,则需要提出申请.若申请通过,学生就可以在第i个时间段去教室di

P1850 换教室

P1850 换教室 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有 2n2n 节课程安排在 nn 个时间段上.在第 ii(1 \leq i \leq n1≤i≤n)个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 c_ic?i?? 上课,而另一节课程在教室 d_id?i?? 进行. 在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 nn 节安排好的课程.如果学生想更换第 ii 节课程的教