求求大佬帮我改一下小鸟
查看原帖
求求大佬帮我改一下小鸟
250699
mot1ve楼主2020/9/11 18:07

先不用考虑答案为0的情况,我写的这个代码只处理了答案为1的情况,但为什么是错的。

//BFS,两种决策要么上升,要么下降,边界很简单
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,k,flag,idx,can,len,res=INF,ans=-INF;
int up[10010],down[10010];
struct node{
    int x,y,cnt;
};//小鸟此时横坐标和纵坐标和点击屏幕的次数和能通过几个管道 
struct node2{
    int h,l;//h是上边缘,l是下边缘,pos是坐标 
}g[10010];//管子的属性 
void bfs(int s)
{
    queue<node> q; 
    q.push((node){0,s,0});//横坐标,纵坐标,按屏幕的次数 
    while(q.size())
    {
        node u=q.front();
        q.pop();
        int x=u.x;//横坐标 
        int y=u.y;//纵坐标
        int cnt=u.cnt;
        if(y>m)
        y=m;
        if(y>=g[x].h)//横坐标为x时管子的上边缘
        continue;
        if(y<=g[x].l||y<=0)//横坐标为x时管子的下边缘
        continue;
        if(x==n)
        {
            flag=1;
            ans=cnt;
            break;
        }
        for(int i=1;;i++)
        {
        	if(i*up[x]>m)
        	break;
        	q.push((node){x+1,y+i*up[x],cnt+i});
		}
        q.push((node){x+1,y-down[x],cnt});
    }
}
int main()
{
    cin>>n>>m>>k;
    for(int i=0;i<=n-1;i++)
    {
        scanf("%d%d",&up[i],&down[i]);//横坐标为i时进行操作的up and down 
    }
    for(int i=0;i<=n;i++)
    {
        g[i].h=INF;
        g[i].l=-INF;
    }
    for(int i=1;i<=k;i++)
    {
        int pos,l,h;
        scanf("%d%d%d",&pos,&l,&h);
        g[pos].l=l,g[pos].h=h;
    }
    for(int i=1;i<=m;i++)//初始高度 
    {
        can=0;
        bfs(i);
        res=min(res,ans);//最少需要点击屏幕的次数
        len=max(len,can);
    }
    if(!flag)
    cout<<"0"<<endl<<len;
    else cout<<"1"<<endl<<res;
    return 0;
} 
2020/9/11 18:07
加载中...