Фонарик - пересечь проблему моста
Четыре моста фонарик +
решение
- Рассмотрит теорию графов на другую сторону моста и который искусственно создать государственную точку, в соответствии с правилами, даже в стороне и добавить веса, то никто не состояние точка до четырех людей работает в кратчайших точках по всему штату с другой стороны , самая короткая длина является ответом
- Суть в том , чтобы построить и планы строительства несколько громоздким и не легко продвигать, 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;
}