zoukankan      html  css  js  c++  java
  • 1062昂贵的聘礼

    1.等级那里要用枚举,没有考虑到1(3)2(2)3(4)4(5)按照我的第一种做法的话,那么4号物品会被去掉,但是如果有一条线从3——2——1呢,3跟2不可以交易的

    2.用了chang[],一开始枚举等级的时候,没有考虑到一种情况枚举后,他会改变chang数组

    自己的代码(没有通过)

    #include "iostream"
    #include "queue"
    #include "string.h"
    using namespace std;
    #define INF 0x7fffffff
    struct {
      int p,l,x;
    }thing[120];
    struct{
       int s,v,e;
    }chang[120],exchang[120];
    
    int main(){
       int m,n,top=0,set[120],i,j,flag=0,a=0,k,data[1000],min=INF;
       queue<int>Q;
       cin>>m>>n;
       for(i=1;i<=n;i++){
         cin>>thing[i].p>>thing[i].l>>thing[i].x;
         for(j=0;j<thing[i].x;j++){
           cin>>chang[flag].s>>chang[flag].v;
           chang[flag].e=i;
           flag++;
         }
       }
       for(i=0;i<flag;i++){exchang[i]=chang[i];}
    
       for(k=thing[1].l-m;k<=thing[1].l;k++){
          for(i=0;i<flag;i++){chang[i]=exchang[i];}
          top=0;
          memset(set,0,sizeof(set));
          for(i=1;i<=n;i++){
            if(thing[i].l>k+m||thing[i].l<k)
             set[i]=1;
          }
    
          for(i=0;i<flag;i++){
            if(!set[chang[i].s]&&!set[chang[i].e]){
              chang[top].s=chang[i].s;
              chang[top].e=chang[i].e;
              chang[top].v=chang[i].v;
              top++;
           }
          }
    
         for(i=top-1;i>=0;i--){
           if(thing[chang[i].e].p>thing[chang[i].s].p+chang[i].v){
               thing[chang[i].e].p=thing[chang[i].s].p+chang[i].v;
            }
          }
         data[a++]=thing[1].p;
       }
      for(i=0;i<a;i++){
        if(data[i]<min)min=data[i];
      }
      cout<<min<<endl;
    }

    我也不知道错在哪里,自己想了很多例子都通过了丫,不过还是wr,以后再回来看看是什么问题吧

    网上的答案

    #include <stdio.h>
    #include <string.h>
    #define MAX(a,b) ((a)>(b)?(a):(b))
    #define MIN(a,b) ((a)<(b)?(a):(b))
    #define INF 0x7fffffff
    #define N 101
    int g[N][N],dist[N],val[N],rank[N],n,m;
    char vis[N];
    void dijkstra(int u,int s)
    {
        int v,i,min,k;
        memset(vis,0,sizeof(vis));
        for(i=0;i<n;i++)    dist[i]=(i==u?0:INF);
        for(i=0;i<n;i++)
        {
            min=INF;
            for(v=0;v<n;v++)
            {
                if(!vis[v]&&dist[v]<=min&&rank[v]>=s&&rank[v]<=s+m)   min=dist[k=v];
            }
            vis[k]=1;
            if(min==INF)    break;
            for(v=0;v<n;v++)
            {
                if(rank[v]>=s&&rank[v]<=s+m&&g[k][v]!=INF&&dist[v]>=dist[k]+g[k][v])    dist[v]=dist[k]+g[k][v];
            }
        }
    }
    int main()
    {
        int i,j,k,a,b,s,tmp,ans;
        while(~scanf("%d%d",&m,&n))
        {
            for(i=0;i<n;i++)
            {
                for(j=i+1;j<n;j++)    g[i][j]=g[j][i]=INF;
            }
            for(i=0;i<n;i++)
            {
                scanf("%d%d%d",&val[i],&rank[i],&k);
                for(j=0;j<k;j++)
                {
                    scanf("%d%d",&a,&b),a--;
                    g[i][a]=MIN(g[i][a],b);
                }
            }
            ans=INF;
            s=MAX(rank[0]-m,0);
            for(i=s;i<=rank[0];i++)
            {
                dijkstra(0,i);
                tmp=val[0];
                for(j=1;j<n;j++)
                {
                    if(dist[j]==INF)    continue;
                    tmp=MIN(tmp,dist[j]+val[j]);
                }
                ans=MIN(ans,tmp);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    解决Linux ssh登录马上退出问题
    FineReport实线java报表填报录入的效果图
    CCEditBox/CCEditBoxImplMac
    Android图片异步载入框架Android-Universal-Image-Loader
    HYAppFrame(WinForm框架源代码)安装部署指南
    ASP.NET Web Api 2 接口API文档美化之Swagger
    Android OTA在线升级一(架构分析)【转】
    Android进程间通信(IPC)机制Binder简要介绍和学习计划【转】
    Linux内核源码中的likely和unlikely释疑【转】
    Android蓝牙串口通讯【转】
  • 原文地址:https://www.cnblogs.com/dowson/p/3251830.html
Copyright © 2011-2022 走看看