От «Четыре моста» до «N людей через мост.»


Фонарик - пересечь проблему моста


Четыре моста фонарик +

решение

  • Рассмотрит теорию графов на другую сторону моста и который искусственно создать государственную точку, в соответствии с правилами, даже в стороне и добавить веса, то никто не состояние точка до четырех людей работает в кратчайших точках по всему штату с другой стороны , самая короткая длина является ответом
  • Суть в том , чтобы построить и планы строительства несколько громоздким и не легко продвигать, wyxdrqc большой брат говорит , что вы можете использовать четыре цифры двоичного числа для обозначения состояния, х число людей , с другой стороны его соответствующего х бит равен 1, и 0 в противном случае, где не пытаться реализовать код, код только для создания более хлопотно карты и кратчайший путь алгоритм с Floyd


заботы

Код

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
int num,c[5],e[105][105],p[105],q[105][105],t[105][105],d[5][5][105];
void build()
{
    for(int i=1;i<=3;i++)
      for(int j=i+1;j<=4;j++)
      {
        num++;
        q[num][++p[num]]=i;
        q[num][++p[num]]=j;
        d[1][i][++t[1][i]]=num;
        d[1][j][++t[1][j]]=num;
        e[0][num]=max(c[i],c[j]);
      }
    for(int i=1;i<=4;i++)
    {
        num++;
        q[num][++p[num]]=i;
        d[2][i][++t[2][i]]=num;
        for(int j=1;j<=t[1][i];j++)
          for(int k=1;k<=p[d[1][i][j]];k++)
            if(q[d[1][i][j]][k]!=i) e[d[1][i][j]][num]=c[q[d[1][i][j]][k]];
    }
    for(int i=1;i<=2;i++)
      for(int j=i+1;j<=3;j++)
        for(int k=j+1;k<=4;k++)
        {
            num++;
            q[num][++p[num]]=i;
            q[num][++p[num]]=j;
            q[num][++p[num]]=k;
            d[3][i][++t[3][i]]=num;
            d[3][j][++t[3][j]]=num;
            d[3][k][++t[3][k]]=num;
            for(int l=1;l<=t[2][i];l++) e[d[2][i][l]][num]=max(c[j],c[k]);
            for(int l=1;l<=t[2][j];l++) e[d[2][j][l]][num]=max(c[i],c[k]);
            for(int l=1;l<=t[2][k];l++) e[d[2][k][l]][num]=max(c[i],c[j]);
        }
    for(int i=1;i<=3;i++)
      for(int j=i+1;j<=4;j++)
      {
        num++;
        q[num][++p[num]]=i;
        q[num][++p[num]]=j;
        d[4][i][++t[4][i]]=num;
        d[4][j][++t[4][j]]=num;
        for(int l=1;l<=t[3][i];l++)
          for(int r=1;r<=t[3][j];r++)
            if(d[3][i][l]==d[3][j][r])
              for(int k=1;k<=p[d[3][i][l]];k++)
                if(q[d[3][i][l]][k]!=i&&q[d[3][i][l]][k]!=j)
                  e[d[3][i][l]][num]=c[q[d[3][i][l]][k]];
      }
    num++;
    for(int i=1;i<=3;i++)
      for(int j=i+1;j<=4;j++)
        for(int l=1;l<=t[4][i];l++)
          for(int r=1;r<=t[4][j];r++)
            if(d[4][i][l]==d[4][j][r])
            {
                int res=0;
                for(int k=1;k<=4;k++) if(k!=i&&k!=j) res=max(res,c[k]);
                e[d[4][i][l]][num]=res;
            }
    return;
}
int main()
{
    for(int i=1;i<=4;i++) scanf("%d",&c[i]);
    sort(c+1,c+4+1);
    for(int i=0;i<=25;i++)
      for(int j=0;j<=25;j++)
        if(i!=j) e[i][j]=1e9;
    build();
    for(int k=0;k<=num;k++)
      for(int i=0;i<=num;i++)
        for(int j=0;j<=num;j++)
          if(i!=k&&k!=j&&e[i][k]!=1e9&&e[k][j]!=1e9)
            e[i][j]=min(e[i][j],e[i][k]+e[k][j]);
    printf("%d\n",e[0][num]);
    return 0;
}


N + фонарик через мост

решение

  • Рассмотрим жадный подход, мы используем самый быстрый человек как человек обратно в фонарь, самый медленный из медленных времен и народов, перемещаемых на другую сторону времени, проведенного в ногу со временем и быстро, как человек, который вернул фонарик, самый быстрый и самый медленный человек перевезены в другую сторону времени, которое требуется для сравнения, каждый раз добавляя в ответ анс в меньших и сократить число 2 (п = 2), можно показать, что такая жадность правильно
  • В случае оставшееся число меньше, чем 4 (п <4):

    п = 3, плюс три раза суммы , потраченной
    раз 2 п =, то два проводили время вместе с большим человеком , чтобы тратить время на
    п = 1, вместе с этим человеком , чтобы провести время

Код

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define LL long long
using namespace std;
const int N=1e6+5;
int n,ans,c[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&c[i]);
    sort(c+1,c+n+1);
    while(n>=4)
    {
        if(2*c[1]+c[n]+c[n-1]<c[1]+2*c[2]+c[n]) ans+=2*c[1]+c[n]+c[n-1];
        else ans+=c[1]+2*c[2]+c[n];
        n-=2;
    }
    if(n==3) ans+=c[1]+c[2]+c[3];
    else if(n==2) ans+=c[2];
    else if(n==1) ans+=c[1];
    printf("%d\n",ans);
    return 0;
}

рекомендация

отwww.cnblogs.com/Hawking-llfz/p/11527464.html