PAT 甲级 2019年9月8号 题解

2019年9月PAT就这样凉了=、= 一、总结先行,留给后人: 编译器相当于全新,一些功能需要自己配置。 要在窗口上面右键->属性设置快速编辑模式之后才可以右键直接复制 考场键盘静音还可以(武汉科技考点),现场没有想象中的吵闹 做题时要仔细读题!很重要,思路走偏的代价是远远超过读题花费的时间的。尤其是后面的提目!因为题干相对较长,代码量大,难度高,且分值多。而且题目中有很多蛛丝马迹(可以推敲出命题老师是想坑你,还是良心发现,想... 阅读详情

第一题:dfs+剪枝

k位数不能所有的数字都遍历一遍,必须有选择的。选择k位数和为m的。

remain为剩下未分配数的位置的和。remain必须小于等于剩下的位数*9。因为若是大于的话,剩下的所有位数都为9,都满足不了所有位加起来为m。比如k=3,m=20,如果第一位为1,则return。因为无论后面两位是什么,这个三位数的和都小于20。所以

这样剪枝。就是在位数为k,所有位和为m的数里找了。

cnt为当前已经分配了数字的位数。remain为剩下的位数的数字之和。gdb为辗转相除法。当时差点没想起来,真的没印象了,名字都记错。判断质数,等于2也返回false,是因为要求最大公约数为大于2的质数。

#include<bits/stdc++.h>

using namespace std;

typedef long long LL;
struct node{
    LL val;
    int n;
    friend bool operator <(node a,node b)
    {
        if(a.n!=b.n)
        {
            return a.n<b.n;
        }else
        {
            return a.val<b.val;
        }
    }
};
int N,k,m;
set<node> ans;
bool isprime(int x)
{
    if(x<=2) return false;
    for(int i=2;i*i<=x;i++)
    {
        if(x%i==0) return false;
    }
    return true;
}
int gdb(int a,int b)
{
    if(b==0) return a;
    else{
        a = a%b;
        return gdb(b,a);
    }
}
int sum(LL x)
{
    int sum = 0;
    while(x!=0)
    {
        sum+=x%10;
        x/=10;
    }
    return sum;
}
void dfs(int cnt,LL num,int remain)
{
    if(remain>(k-cnt)*9) return;
    if(cnt==k)
    {
        LL temp = num + 1;
        int n = sum(temp);
        int x = gdb(max(m,n),min(m,n));
        if(isprime(x))
        {
            ans.insert(node{num,n});
        }
        return;

    }
    for(int i=0;i<=min(remain,9);i++)
    {
        if(cnt==0&&i==0) continue;
        dfs(cnt+1,num*10+i,remain-i);
    }
}
int main()
{
    scanf("%d",&N);

    for(int i=1;i<=N;i++)
    {
        ans.clear();
        scanf("%d%d",&k,&m);
        dfs(0,0,m);
        printf("Case %d\n",i);
        if(ans.size()==0)
        {
            printf("No Solution\n");
        }else
        {
            for(auto it:ans)
            {
                printf("%d %ld\n",it.n,it.val);
            }
        }
    }
    return 0;

}

结果:

第二题:

经典的链与链之间的操作。用unordered_map存初始数据。再从第一个结点开始遍历。把两个链存进v1,v2。

再遍历v1,v2。把它按照规则存进ans。再输出ans。注意最后一个结点。以及地址的位数。要注意,是谁长谁是v1.而不是第一个链。

#include<bits/stdc++.h>

using namespace std;

struct node{
    int add;
    int val;
    int next1;
};

int root1,root2,m;
unordered_map<int,node> hash1;
vector<node> v1,v2,ans,temp;

int main()
{
    scanf("%d%d%d",&root1,&root2,&m);
    for(int i=0;i<m;i++)
    {
        int add,val,next1;
        scanf("%d%d%d",&add,&val,&next1);
        hash1[add]=node{add,val,next1};
    }
    int root = root2;
    while(root!=-1)
    {
        v1.push_back(hash1[root]);
        root = hash1[root].next1;
    }
    root = root1;
    while(root!=-1)
    {
        v2.push_back(hash1[root]);
        root = hash1[root].next1;
    }
    if(2*v1.size()<=v2.size())
    {
        temp = v1;
        v1= v2;
        v2 = temp;
    }
    int cnt1 = 0,cnt2 = v2.size()-1;
    while(cnt1<v1.size()&&cnt2>=0)
    {
        ans.push_back(v1[cnt1++]);
        if(cnt1>=v1.size())break;
        ans.push_back(v1[cnt1++]);
        if(cnt1>=v1.size())break;
        ans.push_back(v2[cnt2--]);
        if(cnt2<0)break;
    }
    while(cnt1<v1.size())
    {
        ans.push_back(v1[cnt1++]);

    }
    while(cnt2>=0)
    {
         ans.push_back(v2[cnt2--]);
    }
    for(int i=0;i<ans.size();i++)
    {
        if(i!=ans.size()-1)
        printf("%05d %d %05d\n",ans[i].add,ans[i].val,ans[i+1].add);
        else
        {
             printf("%05d %d -1\n",ans[i].add,ans[i].val);
        }
    }
    return 0;
}

结果:

第三题:

给出每个结点的两个孩子与内容。输出后缀表达式。首先,把所有的孩子,除了-1外都存下来。缺的哪一个就是根节点。

再遍历树。注意,若结点,左右子树都有,则后序,若无左子树,则先序遍历。把结果存进string,再输出。

#include<bits/stdc++.h>

using namespace std;

struct node{
    string s;
    int left;
    int right;
};
vector<node> v;
unordered_map<int,bool> hash1;
int N;
string ans;
string dfs(int now)
{
    if(now==-1) return "";
    string str;
    if(v[now].right!=-1&&v[now].left!=-1)
    str = "(" + dfs(v[now].left) + dfs(v[now].right) + v[now].s + ")";
    else if(v[now].left==-1)
    {
        str = "("  + v[now].s + dfs(v[now].right)  + ")";
    }
    return str;
}
int main()
{
    scanf("%d",&N);
    v.resize(N+1);
    for(int i=1;i<=N;i++)
    {
        cin>>v[i].s>>v[i].left>>v[i].right;
        if(v[i].left!=-1)
            hash1[v[i].left]=true;
        if(v[i].right!=-1)
            hash1[v[i].right]=true;
    }
    int u = 1;
    while(hash1[u]==true&&u<=N) u++;
    ans = dfs(u);
    cout<<ans;
    return 0;
}

 结果:

第四题

dijkstra过程为每一轮找到与原点最近的结点加入以经确定路径集合。而这找最近点的顺序可以形成序列。考察序列是否为dij序列。每一轮,看序列上对应的点,是否是这一步距离源点最近的点,若不是,则返回false。若是,则把该点加入已确定的点,再通过相应的边更新其余点距离源点的距离。直到所有点都确定了最短路径。则返回true。

刚开始,我以为这题应该会很容易超时。所以准备用优先队列,查找距离源点最近点会快一点。后来发现不行。因为不是找最近点。而是确定序列上对应点是不是这一轮的最近点。因为,可能有距离相等值。所以后来按照普通dij,也没超时。

还有一个更好理解的方法就是。直接dij一轮。看序列上的点是否是按照距离源点以不减的方式排列的。是的那就是true。不是就是false。

#include<bits/stdc++.h>

using namespace std;
priority_queue<int> q;
const int inf = 1<<30;
const int maxn = 1010;
int nv,ne,K;
int g[maxn][maxn];
int d[maxn];
bool vis[maxn];
vector<int> v;

bool dijkstra()
{
    bool flag = true;
    int cnt = 0;
    fill(d,d+maxn,inf);
    fill(vis,vis+maxn,false);
    d[v[cnt]]=0;
    for(int i=0;i<nv;i++)
    {
        int u = -1,minn = inf;
        for(int j=1;j<=nv;j++)
        {
            if(vis[j]==false&&d[j]<minn)
            {
                u = j;
                minn = d[j];
            }
        }
        if(d[u]<d[v[cnt++]])
        {
            flag = false;
            break;
        }
        if(u==-1) break;
        vis[u] = true;
        for(int j=1;j<=nv;j++)
        {
            if(vis[j]==false&&g[u][j]!=inf)
            {
                if(d[j]>d[u]+g[u][j])
                {
                  d[j] = d[u]+g[u][j];
                }
            }
        }
    }
    if(cnt!=nv) flag = false;
    return flag;
}
int main()
{
    fill(g[0],g[0]+maxn*maxn,inf);
    scanf("%d%d",&nv,&ne);
    v.resize(nv);
    for(int i=0;i<ne;i++)
    {
        int u,v,dis;
        scanf("%d%d%d",&u,&v,&dis);
        g[u][v]=g[v][u]=dis;
    }
    scanf("%d",&K);
    for(int i=0;i<K;i++)
    {
        for(int j=0;j<nv;j++)
        {
            scanf("%d",&v[j]);
        }
        if(dijkstra())
        {
            printf("Yes\n");
        }else
        {
            printf("No\n");
        }
    }
    return 0;
}

结果:

2020年9月PAT甲级满分必备刷题技巧 这份技巧帮你一网打尽所有的要点 阅读详情

相关推荐

PAT简介和2019年秋季浙大PAT考试报名流程

PAT简介: 计算机程序设计能力考试(Programming Ability Test,简称 PAT ) 旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力, 科学的评价计算机程序设计人才, 为企业选拔人才提供参考标准。 PAT目前有考点 67 处, 分布在 26 省/直辖市的 49 座城市中, 涉及合作院校 60 所。 联盟院校承诺为考试提供统一配置的机房以及网络...

小阿兜的博客 9376

2019年9月 PAT甲级考试满分题解

整场回顾: 考前训练了不少,心情还是比较放松的,就告诉自己稳住心态,认真读题,不要钻牛角尖 开始考试,发现整体题目还好,没有很复杂,就开始从头看:A题发现意思很简单,但是不是很好想,想了一会大致有了个方向,因为A数字+1会产生较大变化,最后一位必然是9,然后我寻思这A题应该更简单,等等再看有没有更简单的做法。 然后看榜发现有俩哥们出了D题,然后出于自信我也直接去看D题,发现这场提很友好,题目...

床前明月光 1716

PAT备考经验&相关信息

在9月8号下午的PAT考试中,我幸运的拿到了满分,用时1小时45分钟,排名第五,算是成功迈出了转专业的第一步。按照惯例应该嘚瑟一波,然而身边并没有人考这个,转念一想,不如把考试日志和备考经验教训记录下来,以期看见此文的后来者能少走一些弯路,更加高效的刷题学习(虽然可能并没有人能看到 _(:△」∠)_ )。 当然,在科班大佬面前我只是个尚未入门的弱鸡,因此这篇经验主要针对有意转行/业余爱好编程/基...

qq_38658814的博客 1万+

PAT 2019 9月8号总结

第一题: 一个整数A,所有位加起来为m,A+1的所有位数加起来为n,m和n的最大公约数为大于2的质数,则A称为永远数。 给出m个查询,每个查询给出k(A的位数)和 m(A的位数和),找出可能的A,以及对应的n。 采用dfs和回溯剪枝。每一层dfs确定以为,当遍历深度为k的时候,结束,判定该数字是否为永远数。 每一位可能取的值为0——9,深度为0,也就是第一层,数字不能为0。 剪枝,每一层...

CSlerner的博客 728

整理PAT甲级题解

题目汇总 20分 1001 A+B Format 20 1005 Spell It Right 20 1008 Elevator 20 1011 World Cup Betting 20 1015 Reversible Primes 20 1019 General Palindromic Number 20 1023 Have Fun with Numbers 20 102...

一起努力 1389

2019年9月8日秋季PAT甲级题解-2-1161-Merging Linked Lists (25 分) 双解法

Given two singly linked listsL​1​​=a​1​​→a​2​​→⋯→a​n−1​​→a​n​​andL​2​​=b​1​​→b​2​​→⋯→b​m−1​​→b​m​​. Ifn≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a li...

qiiingc的解题记录 2353

PAT甲级感悟(2019年9月8日秋期考的试)

今天刚刚考完PAT,趁着还没忘干净,写下此篇文章,不敢说是经验,也不敢谈什么心得,只想把自己的感悟分享给大家。 先膜一下柳神:柳神博客是真的好用,没得说,我基本上就是看柳神的博客,然后刷题,然后再看博客 今天的考试,进考场之前很紧张,疯狂喝水,疯狂喝,然后就上厕所,真的很紧张,以至于刚开始写代码的时候手还有点抖。第一题就给我整懵了,这题是啥?这说的啥?我该咋做?一顿阅读理解之后,开始写代码,完了...

qwe1765667234的博客 767

基于微信小程序的智能门禁管理系统的设计与实现(文章+源码)

基于微信小程序门禁管理小程序,该系统支持用户注册登录、查阅新闻动态、提交开门申请和发布留言等功能,同时管理员可以进行用户管理、新闻信息管理、门禁审批管理和留言管理等操作。该系统将采用IDEA开发工具、SSM框架和MYSQL数据库等相关技术,实现用户登录注册、个人信息管理、门禁申请提交、管理员审核等功能。该系统的实现,可以有效提高门禁管理的效率和便利性,同时也具有较强的可扩展性和可维护性。本研究对于智能门禁管理系统的设计和实现具有一定的参考价值。

u011779145的博客 1398

2019年9月 第一次参加PAT考试体验及题解

我是在暑假才知道有浙江大学PAT这个考试,想着暑假也没什么计划,于是想刷刷题目,锻炼一下自己的code能力,于是计划开始准备,最早七月底做了几道题,到八月十号左右,开始集中注意力刷题,每天刷7-10道题。 到八月底,我已经将PAT甲级的题目全部刷了一遍,当然有几道题不会做,比如A1026 table tennis,这道模拟题真的很头疼。于是我就跳过了,一直到最后借鉴学长的代码,但是也没有完全弄懂/...

冰冻三尺非一日之寒 7907

MATLAB实战:5步搞定铣削稳定性叶瓣图(附完整代码解析)

本文提供了一份基于MATLAB的铣削稳定性叶瓣图实战指南。通过5个清晰步骤,从动力学原理出发,详细解析了利用半离散法构建稳定性判据、模块化代码设计、高效参数扫描及高级可视化的完整流程,并附有完整代码,帮助工程师快速预测和规避加工颤振,优化铣削工艺参数。

weixin_29197051的博客 194

iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决

问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这是什么原因导致的呢? Let’s find out!???? 问题分析 1. 排除其它原因 首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。 在SKProductsRequestDelegat代理实现的productsRequest方法里下断点: func produc

享受开发,颠倒银河 6141

PAT学习资料汇总(PAT甲级、PAT顶级、PAT考试经验)

二、PAT甲级 PAT甲级真题目录(按题型整理) PAT甲级真题目录(按题型整理)_love music.的博客-优快云博客_pat甲级真题 PAT甲【所有题目+解析+代码示例+总结】附带所有历年整体+讲解+代码 PAT甲【所有题目+解析+代码示例+总结】附带所有历年整体+讲解+代码_繁星蓝雨的博客-优快云博客 2020年9月PAT甲级满分必备刷题技巧 2020年9月PAT甲级满分必备刷题技巧_浒鱼鱼的博客-优快云博客_pat刷题 PAT甲级真题 PAT甲级真题_ZXX

青少年趣味编程 6302

Xilinx平台SRIO介绍(五)示例工程Example Design介绍

理解IP的使用,少不了Example Design的学习。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

2019年9月 PAT甲级 7-1 Forever 题解

PAT甲级 7-1 Forever 题解 题意 输入N对K和m,要求找到所有K位数满足: 1.该数的和为m; 2.该数+1的和为n; 3.m和n的最大公约数是一个大于2的质数; 思路 K<10,最大为9,暴力枚举是10的9次,肯定超时,需要缩小枚举范围。 看到这题,我觉得一种数学直觉是大家都会有的,那就是:任意一个数p和p+1一般都是互质的吧。事实也是如此(我一时没想到反例)。 这就意味着,...

GMatrix的博客 970

数据分析!Python爬虫爬取B站UP主数据并分析涨粉规律(附可视化图表)

爬取更多UP主:扩充列表,增加需要分析的UP主UID数量爬取更多作品:修改的参数,增加每个UP主的作品爬取页数新增分析维度:在类中添加方法,可分析发布时间(如定时发布对涨粉的影响)、内容标签(如游戏/知识区涨粉差异)优化可视化样式:调整方法中的图表类型、颜色、标题等,适配个人展示需求播放量与粉丝数强正相关:从相关性热力图可看出,总播放量与粉丝数的相关系数通常在0.8以上,说明曝光量是涨粉的核心基础作品数量存在“边际效应”

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1225

AutoSAR系列讲解(入门篇)4.1-BSW概述

BSW概述,主要讲解BSW的结构组成

雪云飞星的博客 4万+

2019年9月8日秋季PAT甲级题解A1163(7-4)Dijkstra Sequence

2019年9月8日秋季PAT甲级题解 A1163(7-4)Dijkstra Sequence (30 分) #include<iostream> #include<vector> #include<algorithm> using namespace std; const int MAXV = 1010; const int INF = 0x3fffffff;//or 10^9. int g[MAXV][MAXV]; int main() { int nv, ne, k

cold_lemon的博客 679

H3C BGP联盟实验

bgp,bgp联盟,bgp公认团体属性,

一只懒羊羊 968

2019 PAT甲级秋季考试总结

因为要考研浙大软院,所以考个PAT甲级抵机试是很好的!而且之前天梯赛金奖发了150的代金券,让原价256的考试看起来也没那么贵了~于是很早就报名啦!(但是很后悔3月份那场没报,不然就可以更早轻松一点了 我暑假是在家复习考研的,从8.20开始每晚只AC,开始10天在恶补树的相关知识(没错我的树很差555),从树的遍历到BST,AVL,堆,到最后我每天自己写一遍AVL,已经可以3min打完平衡函数了...

请赐教 4759

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【PAT甲级】PAT (Advance Level) 训练记录【纪念19年9月8号PAT甲级满分~】

为了继续增加自己的编程与算法能力,继续刷PAT甲级的考试题。由于最近在公司实习,还有公司的考试题要做,因此记录甲级的做题记录可能会比较慢,只能回家的时候做一会,但是贵在坚持。 本文是一个归档文章,将所有题目的具体链接与部分信息记录在这里 本文持续更新中(to be continued…) 博客中涉及的代码均存储在我的GitHub仓库中,如有需要可以直接点击链接查看或下载: PAT甲级代码(上传代码...

初见还是重逢的博客 1154

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

2019年9月8日pat甲级第一题

2019年9月8日pat甲级第一题思路 pow(10,k-1)遍历到pow(10,k),若当前值不满足条件,则寻找下一个可能值。注意到任意的数加若干个连续的9,如999其各位数值之和增加不超过27,因此可以用(m-sum(当前各位数值之和)-1(注意到循环要加1))/9来决定加多少个连续的9。 这里最注意是理解当前值不是可能值,那么从当前值出发到那个值都不是可能值呢?就是加若干个连续的9组成的数字...

qq_39643198的博客 397

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

2019年秋季PAT甲级考试记录、经验总结

在武汉科技大学黄家湖校区考的,非常偏远,在很荒僻的地方,荒僻到公交都要3元的地方(开玩笑~)。我去的路上大概花了两个小时,12点半到的,武科机房软、硬件条件很好,跟官网的要求一样,绝对能够满足各种常用的较新版本的编译器,我自己学校只有vs2010… 去了之后有教室休息,我趴在桌上睡着了,幸好最后一个走的同学叫醒了我,那时候离开考不到五分钟了……很感谢那位素不相识的同学。 考试各方面的环境和条件...

qq_39115541的博客 3796

2019年9月8日PAT甲级考试总结

九月八号考了PAT甲级,65分,总结一下。 自我感觉这个成绩不太行,但是也没有特别差。 总共四道题,第一道就被卡住,想用递归把数字模拟出来,但是一直没能实现,消耗将近一个小时。这样只能先做后面的题目,幸好后面的题目是比较拿手的,一道是链表题,一道是二叉树的递归遍历。尤其是二叉树递归遍历这道,考试前看到过挺多次,这两道题一个小时就写完。第四道题想偷鸡得点分数,可惜天不从人愿。于是回去看第一道题,...

gehulushang的博客 1287

PAT甲级2019春季真题题解

PAT甲级2019春季题目及满分代码下载 A Sexy Primes   签到题,素数不需要用筛法,直接O(sqrt(n))即可。 #include<iostream> using namespace std; bool check(int a) { if (a < 2) return false; for (int i = 2; i * i <= a; i++) if (a % i == 0) retur

Raymond_YP的博客 446

PAT(甲级)2019年冬季考试

PAT(甲级)2019年冬季考试7-1 Good in C (20分)7-2 Block Reversing (25分)7-3 Summit (25分)7-4 Cartesian Tree (30分) 7-1 Good in C (20分) 题意:给定 26 字母的写法,每个由 7×57\times 57×5 的字符矩阵组成。给定一个字符串 s,让你输出 s 中的每个单词。 思路:将 26 个字母存在三维数组中。然后在 s 中找到所有的单词。最后根据单词构造这个答案。每次都指定好,每个字母的位置即可。 细

qq_17080419的博客 377
上一篇: PAT 2019 9月8号总结
下一篇: python 萌新修仙录 py编程:从入门到实践第一部分
CSlerner
博客等级 码龄9年 153粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值