第二十一次总结

今天水两个题

题目链接
P1359 租用游艇

这个题写的方法有很多,可以动态规划打dp表写,也这样从三种最短路中选一个写也没问题

这个题我用的是Floyd来写,因为数据小,用Floyd也可以过

按照模板去写就好了,主要是注意要用输入就可以了

第二十一次总结_第1张图片

 一开始我没明白这个输入的意思,之后看了题解的分析才知道

5 15 中,5是1到2的距离,15是1直接到3的距离

7是2到3的距离

因此最短路也就是5+7=12

#include
using namespace std;
int n,sum=0;
int e[205][205];
int inf=999999999;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
        if(i==j)
        e[i][j]=0;
        else
        e[i][j]=inf;
    }
    for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++)
    cin>>e[i][j];
    for(int k=1;k<=n;k++)
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++){
        if(e[i][j]>e[k][j]+e[i][k])
        e[i][j]=e[i][k]+e[k][j];
    }
    printf("%d",e[1][n]);
}

只需要注意输入的代码就可以了

P2121 拆地毯

题目链接
 

这个题只需要注意题目的关键点:美丽度之和的最大值,就可以写出来了,也就代表这这个题要求我们求的是“最大生成树”,改一下排序顺序和退出循环的条件就好了

#include
using namespace std;
unsigned long long ans=0,sum=0;
int n,m,k;
#define maxn 100010
int arr[maxn];
struct arr{
    int u,v,w;
}e[maxn],t;
void quicksort(int left,int right){
    if(left>right)
    return ;
    int i=left;
    int j=right;
    while(i!=j){
        while(e[j].w<=e[left].w&&i=e[left].w&&i>n>>m>>k;
    for(int i=1;i<=m;i++)
    cin>>e[i].u>>e[i].v>>e[i].w;
    quicksort(1,m);
    init();
        for(int i=1;i<=m;i++){
        if(merge(e[i].u,e[i].v)){
            ans++;
            sum+=e[i].w;
        }
        if(ans==k)
        break;
    }
    printf("%llu\n",sum);
    return 0;
}

直接套模板

你可能感兴趣的:(算法,c++,数据结构)