PAT甲 题目笔记

13 篇文章 1 订阅

1001 A+B Format (20分)

Do not forget to use using namespace std;
string to int: use str=to_string(int)
string’s length: .length(str)
insert a character in string: str.insert(len-3,",");

1002 A+B for Polynomials (25分)

polynomial 多项式(的)
exponents and coefficients 指数和系数
respectively 依次为

use #include<bits/stdc++.h>, which includes most of frequently-used header files.
保留一位小数:cout<<setprecision(1)<<std::fixed<<c[i];
网上多直接printf(" %d %.1f", i, p[i]); 向下取整,据说四舍五入会特别标明。

1003 Emergency (25分)

scattered 分散的

Dijkstra算法求最短路径,这道题的难度是求最短路径的条数以及最短路径中的条件最优解。作为一般的Dijkstra算法将这道题放上来供参考:

#include<bits/stdc++.h>
#define N 501
#define M 0x3f3f3f3f
using namespace std;
int main(){
    int mp[N][N];
    int r[N];
    int n,m,c1,c2,p1,p2,l;
    int flag[N];
    int d[N];
    int p[N];
    int way[N];
    int rs[N];
    cin>>n>>m>>c1>>c2;
    for(int i=0;i<n;i++){
        cin>>r[i];
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
                mp[i][j]=M;
        }
    }
    for(int i=0;i<m;i++){
        cin>>p1>>p2>>l;
        mp[p1][p2]=l;
        mp[p2][p1]=l;
    }
    for(int i=0;i<n;i++){
        d[i]=mp[c1][i];
        flag[i]=0;
        way[i]=1;
        rs[i]=0;
        if(d[i]<M&&i!=c1){
            p[i]=c1;
            rs[i]=r[i]+r[c1];
        }
    }
    int k=c1;
    flag[k]=1;
    d[k]=0;
    rs[k]+=r[k];
    int minn;
    for(int i=1;i<n;i++){
        minn=M;
        for(int j=0;j<n;j++){
            if((!flag[j])&&d[j]<minn){
                minn=d[j];
                k=j;
            }
        }
        flag[k]=1;
        for(int j=0;j<n;j++){
            if(d[j]==d[k]+mp[k][j]){
                way[j]+=way[k];
                if(rs[j]<rs[k]+r[j])rs[j]=rs[k]+r[j];
            }
            else if(d[j]>d[k]+mp[k][j]){
                d[j]=d[k]+mp[k][j];
                p[j]=k;
                way[j]=way[k];
                rs[j]=rs[k]+r[j];
            }
        }
    }
    cout<<way[c2]<<" "<<rs[c2]<<endl;
    return 0;
}

本题中不需要p[],它是用来回溯路径的~
总结一下一般的Dijkstra算法的步骤:

  1. 创建邻接矩阵(N<1000,否则用邻接链表),赋初值0x3f3f3f3f;
  2. 双向赋值长度;
  3. 各点标志赋0,指向起点的点上一个点是起点,距起点距离赋上;
  4. 起点标志赋1,开始循环;
  5. 使用中间值寻找标志0的最小距离的点;
  6. 更新各点距离,各点原距离与上点距离与两点距离之和,取小者,若更新了距离,该点指向上点;
  7. 如需计算条数,若更新了距离,该点条数更新为上点的,若相等,该点条数加上上点的;
  8. 输出终点条数距离,按照上点回溯获得路线。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值