首页 > 华为8.18ac代码 最后一题差5%ak
头像
这样
发布于 2021-08-18 23:41
+ 关注

华为8.18ac代码 最后一题差5%ak

第一题:多重背包
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int p[maxn];
int v[maxn];
int tot[maxn];
int dp[1010];
int main(){

 int x,n;
 scanf("%d%d",&x,&n);
 for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&p[i],&tot[i],&v[i]);
    }
    int k = n + 1;
    for (int i = 1; i <= n; i++) {
        while (tot[i] != 1) {
            p[k] = p[i];
            v[k] = v[i];
            k++;
            tot[i]--;
        }
    }
    for (int i = 1; i <= k; i++)
    {
        for (int j = x; j >= 1; j--)
        {
            if (p[i] <= j)
                dp[j] = max(dp[j], dp[j - p[i]] + v[i]);
        }
    }
    int ans=0;
    for(int i=1;i<=x;i++)
    {
        //cout<<dp[i]<<endl;
        ans=max(ans,dp[i]);
    }
    cout<<ans<<endl;
 return 0;
}
第二题 dp计数 
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int a[110];
int dp[10010];

int main()
{
    int x,n;
    scanf("%d%d",&x,&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",a+i);
    }
    dp[0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=x;j>=1;j--)
        {
            if(a[i]<=j)
            {
                dp[j]+=dp[j-a[i]];
            }
        }
    }
    if(dp[x])
        cout<<dp[x]<<endl;
    else
        cout<<-1<<endl;
    return 0;
}
第三题 bfs 只过了95% 不知道bug在哪 

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100+10;
int a[maxn][maxn];
int n,m;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int stx,sty,enx,eny;
struct node
{
    int x,y,v,pr;
    node(){};
    node(int x,int y,int v,int pr):x(x),y(y),v(v),pr(pr){};
    friend bool operator <(const node &t1,const node &t2)
    {
        if(t1.v==t2.v)
        {
            if(t1.x==t2.x)
                return t1.y<t2.y;
            return t1.x<t2.x;
        }
        return t1.v>t2.v;
    }
};
int vis[maxn][maxn][4];
bool check(int x,int y,int i)
{
    if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]==0&&vis[x][y][i]==0)
        return true;
    return false;
}
priority_queue<node> pq;
int bfs()
{
    pq.push(node(stx,sty,0,-1));
    for(int i=0;i<4;i++)
        vis[stx][sty][i]=1;
    while(pq.size())
    {
        node now = pq.top();
        pq.pop();
        if(now.x==enx&&now.y==eny)
            return now.v;
        for(int i=0;i<4;i++)
        {
            int x1=now.x+dir[i][0],y1=now.y+dir[i][1];
            if(x1==enx&&y1==eny)
            {
                if(i!=now.pr)
                    return now.v+1;
                return now.v;
            }
            if(check(x1,y1,i))
            {
                int step=now.v;
                if(i!=now.pr)
                {
                    step++;
                }
                pq.push(node(x1,y1,step,i));
                vis[x1][y1][i]=1;
            }
        }
    }
    return -1;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d%d%d%d",&stx,&sty,&enx,&eny);
    cout<<bfs()<<endl;
    return 0;
}



全部评论

(0) 回帖
加载中...
话题 回帖

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐