PAT2021年春季3月份备考_按照套卷刷真题(2-3)

题干:1150 Travelling Salesman Problem (25 分)

题解:第3个的测试点答案错误,第4个测试点段错误,最后拿了19分,我自己去排查了一下,加了一些防护的措施,但是发现后面还是没有什么用,但是我已经很满意了,我初步估计我考试的话能够拿70分就比较好了,就是说4道题都做出来,但是都有一点错误,因为后面的错误排查确实是相当复杂的,还是缺乏这种编程的经验,尤其是在这么短的环境里面,但是有的时候和满分的答案相比,就是之前的设计思路有点不同导致了最后的一个差异吧,还是可以接受这个结果的。。。。其实这个也看一个在考场上面的运气了

// A1150.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <bits/stdc++.h>
using namespace std;
#define max 100
struct elem {
    int id;
    int dist;
};
vector<elem> ans;
int main()
{
#ifndef ONLINE_JUDGE
#pragma warning(disable:4996)
    freopen("in.txt", "r", stdin);
#endif // !ONLINE_JUDGE
    int n, m,c1,c2,d,k;
    cin >> n >> m;
    vector<vector<int>> gn(n + 1, vector<int>(n + 1, max));
    for (int i = 0; i < m; i++) {
        cin >> c1 >> c2 >> d;
        gn[c1][c2] = d;
        gn[c2][c1] = d;
    }
    cin >> k;
    int n1;
    for (int i = 0; i < k; i++) {
        cin >> n1;
        vector<int> an(n1);
        for (int j = 0; j < n1; j++) {
            cin >> an[j];
        }//input
        bool flag=true;
        int sum = 0;
        int dt=max;
        int simple = true;
        vector<int> bn(n+1, 0);//按照序号来的
        bn[an[0]] = true;
        if (n1 != 1) {
            for (int j = 1; j < n1; j++) {
                dt = gn[an[j - 1]][an[j]];
                if (dt == max) {
                    flag = false;
                    break;
                }
                else {
                    bn[an[j]]++;
                    sum += dt;
                }
            }
        }
        else {
            flag = false;
        }

        if (an[0] != an[n1 - 1]) {
            flag = false;
        }
        for (int j = 1; j <= n; j++) {//n是总的序号
            if (bn[j] == 0) {
                flag = false;
                break;
            }
            if (bn[j] > 1) {
                if (j != an[0]) {
                    simple = false;
                }
            }
            if (bn[j] > 2) {
                simple = false;
            }
        }
        if (flag==false&&dt==max) {
            printf("Path %d: NA (Not a TS cycle)\n", i + 1);
        }
        if (flag == false && dt != max) {
            printf("Path %d: %d (Not a TS cycle)\n", i + 1,sum);
        }
        if (flag == true && simple == false) {
            printf("Path %d: %d (TS cycle)\n", i + 1, sum);
        }
        if (flag == true && simple == true) {
            printf("Path %d: %d (TS simple cycle)\n", i + 1, sum);
        }
        if (flag == true) {
            ans.push_back({ i + 1,sum });
        }
    }
    int f=101;
    int p = -1;
    for (int i = 0; i < ans.size(); i++) {
        if (ans[i].dist < f) {
            f = ans[i].dist;
            p = i;
        }
    }
    printf("Shortest Dist(%d) = %d", ans[p].id, ans[p].dist);
    return 0;
}

别人的满分代码

#include <iostream>
#include <vector>
#include <set>
using namespace std;
int e[300][300], n, m, k, ans = 99999999, ansid;
vector<int> v;
void check(int index) {
    int sum = 0, cnt, flag = 1;
    scanf("%d", &cnt);
    set<int> s;
    vector<int> v(cnt);
    for (int i = 0; i < cnt; i++) {
        scanf("%d", &v[i]);
        s.insert(v[i]);
    }
    for (int i = 0; i < cnt - 1; i++) {
        if(e[v[i]][v[i+1]] == 0) flag = 0;
        sum += e[v[i]][v[i+1]];
    }
    if (flag == 0) {
        printf("Path %d: NA (Not a TS cycle)\n", index);
    } else if(v[0] != v[cnt-1] || s.size() != n) {
        printf("Path %d: %d (Not a TS cycle)\n", index, sum);
    } else if(cnt != n + 1) {
        printf("Path %d: %d (TS cycle)\n", index, sum);
        if (sum < ans) {
            ans = sum;
            ansid = index;
        }
    } else {
        printf("Path %d: %d (TS simple cycle)\n", index, sum);
        if (sum < ans) {
            ans = sum;
            ansid = index;
        }
    }
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; i++) {
        int t1, t2, t;
        scanf("%d%d%d", &t1, &t2, &t);
        e[t1][t2] = e[t2][t1] = t;
    }
    scanf("%d", &k);
    for (int i = 1; i <= k; i++) check(i);
    printf("Shortest Dist(%d) = %d\n", ansid, ans);
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
REGISTER ADDRESS REGISTER DATA(1) HEX 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 1 0 LVDS_ RATE_2X 0 0 0 0 0 0 0 0 0 0 0 0 0 GLOBAL_ PDN 2 PAT_MODES_FCLK[2:0] LOW_ LATENCY_E N AVG_EN SEL_PRBS_ PAT_ FCLK PAT_MODES SEL_PRBS_ PAT_GBL OFFSET_CORR_DELAY_FROM_TX_TRIG[5:0] 3 SER_DATA_RATE DIG_GAIN_ EN 0 OFFSET_CORR_DELAY _FROM_TX_TRIG[7:6] DIG_ OFFSET_ EN 0 0 0 1 0 0 0 0 4 OFFSET_ REMOVA L_SELF OFFSET_ REMOVAL_ START_ SEL OFFEST_ REMOVAL_ START_ MANUAL AUTO_OFFSET_REMOVAL_ACC_CYCLES[3:0] PAT_ SELECT_ IND PRBS_ SYNC PRBS_ MODE PRBS_EN MSB_ FIRST DATA_ FORMAT 0 ADC_RES 5 CUSTOM_PATTERN 7 AUTO_OFFSET_REMOVAL_VAL_RD_CH_SEL 0 0 0 0 0 0 0 0 0 0 CHOPPER_EN 8 0 0 AUTO_OFFSET_REMOVAL_VAL_RD B 0 0 0 0 EN_ DITHER 0 0 0 0 0 0 0 0 0 0 0 D GAIN_ADC1o 0 OFFSET_ADC1o E GAIN_ADC1e 0 OFFSET_ADC1e F GAIN_ADC2o 0 OFFSET_ADC2o 10 GAIN_ADC2e 0 OFFSET_ADC2e 11 GAIN_ADC3o 0 OFFSET_ADC3o 12 GAIN_ADC3e 0 OFFSET_ADC3e 13 GAIN_ADC4o 0 OFFSET_ADC4o 14 GAIN_ADC4e 0 OFFSET_ADC4e 15 PAT_PRB S_LVDS1 PAT_PRBS_ LVDS2 PAT_PRBS_ LVDS3 PAT_PRBS_ LVDS4 PAT_LVDS1 PAT_LVDS2 HPF_ ROUND_ EN_ADC1-8 HPF_CORNER_ADC1-4 DIG_HPF_ EN_ADC1-4 17 0 0 0 0 0 0 0 0 PAT_LVDS3 PAT_LVDS4 0 0 18 0 0 0 0 PDN_ LVDS4 PDN_ LVDS3 PDN_ LVDS2 PDN_ LVDS1 0 0 0 0 INVERT_ LVDS4 INVERT_ LVDS3 INVERT_ LVDS2 INVERT_ LVDS1 19 GAIN_ADC5o 0 OFFSET_ADC5o 1A GAIN_ADC5e 0 OFFSET_ADC5e 1B GAIN_ADC6o 0 OFFSET_ADC6o 1C GAIN_ADC6e 0 OFFSET_ADC6e 1D GAIN_ADC7o 0 OFFSET_ADC7o 1E GAIN_ADC7e 0 OFFSET_ADC7e 1F GAIN_ADC8o 0 OFFSET_ADC8o 20 GAIN_ADC8e 0 OFFSET_ADC8e 21 PAT_PRB S_LVDS5 PAT_PRBS_ LVDS6 PAT_PRBS_ LVDS7 PAT_PRBS_ LVDS8 PAT_LVDS5 PAT_LVDS6 0 HPF_CORNER_ADC5-8 DIG_HPF_ EN_ADC5-8 23 0 0 0 0 0 0 0 0 PAT_LVDS7 PAT_LVDS8 0 0
最新发布
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Exodus&Focus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值