第一题用搜索,超时了,待补

更新第一题思路

dfs + 剪枝,首先确定 n的最后一位数字肯定是9,为什么呢,因为 任意两个相邻的数肯定互为质数(gcd=1),所以 n 的末尾肯定是9,这样n+1产生的各个位数和相加的和 才能有可能和sum(n)产生gcd>2的素数,

所以k可以剪枝成k-1,缩小一位,复杂度降低很多。。。这样估计就能AC了。

另外判断n和n+1两个数的各个位数之和的gcd是否为大于2的素数,可以提前预处理(数据量<90),

第一题参考链接

7-1搜索 12/20分



原来写的代码,超时2个测试点

#include<bits/stdc++.h>
using namespace std; int n,k,m;
typedef long long ll;
ll starts = 0;
ll endss = 0;
bool flag = false;
bool first = true;
int t = 1; int sums(ll x){
int ans = 0;
while(x){
ans += x%10;
x/=10;
}
return ans;
} ll gcd(ll a,ll b){
if(b == 0) return a;
return gcd(b,a%b);
} bool solve(ll x){
if(x <= 2) return false;
for(int i=2;i<=sqrt(x);i++){
if(x%i == 0) return false;
}
return true;
} void dfs(int step,ll x){
if(x >= endss) return;
if(step > k+1) return;
if(sums(x) > m) return;
if(step == k+1) {
int t1 = sums(x);
if(sums(x) != m) return;
int t2 = sums(x+1);
ll g = gcd(t1,t2);
if(solve(g)){
if(first){
first = false;
cout<<"Case "<<t<<endl;
}
flag = true;
cout<<t2<<" "<<x<<endl;
}
return;
}
for(int i=0;i<=9;i++){
if(i==0 && step == 1) continue;
ll temp = x * 10 + i;
dfs(step+1,temp);
}
} int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>k>>m;
starts = pow(10,k-1);
endss = pow(10,k);
flag = false;
first = true;
t = i;
dfs(1,0);
if(flag == false){
cout<<"Case "<<t<<endl;
cout<<"No Solution"<<endl;
}
}
return 0;
}

7-2链表模拟 25

#include<bits/stdc++.h>
using namespace std; const int maxn = 1e5+10; struct node{
int address;
int data;
int next;
}li[maxn]; int s1,s2;
int n; //不一定都是有效结点
vector<node> v1;
vector<node> v2;
vector<node> ans; int main(){
scanf("%d%d%d",&s1,&s2,&n);
for(int i=1;i<=n;i++){
int dat,add,nex;
scanf("%d%d%d",&add,&dat,&nex);
li[add].address = add;
li[add].data = dat;
li[add].next = nex;
}
for(int cur = s1;cur != -1;cur = li[cur].next) v1.push_back(li[cur]);
for(int cur = s2;cur != -1;cur = li[cur].next) v2.push_back(li[cur]);
int len1 = v1.size() - 1;
int len2 = v2.size() - 1;
if(len1 >= 2*len2){
reverse(v2.begin(),v2.end());
int idx2 = 0;
int idx1 = 0;
while(idx2 <= len2){
ans.push_back(v1[idx1++]);
ans.push_back(v1[idx1++]);
ans.push_back(v2[idx2++]);
}
while(idx1 <= len1) ans.push_back(v1[idx1++]);
}else{
reverse(v1.begin(),v1.end());
int idx2 = 0;
int idx1 = 0;
while(idx1 <= len1){
ans.push_back(v2[idx2++]);
ans.push_back(v2[idx2++]);
ans.push_back(v1[idx1++]);
}
while(idx2 <= len2) ans.push_back(v2[idx2++]);
}
n = ans.size();
for(int i=0;i<n-1;i++){
printf("%05d %d %05d\n",ans[i].address,ans[i].data,ans[i+1].address);
}
printf("%05d %d -1\n",ans[n-1].address,ans[n-1].data);
return 0;
}

7-3树 25

#include<bits/stdc++.h>
using namespace std; struct node{
string dat;
int lc,rc;
}tree[25]; int n;
int vis[25]; void dfs(int x){
if(x > n) return;
cout<<"(";
if(tree[x].lc == -1 && tree[x].rc != -1){
cout<<tree[x].dat;
dfs(tree[x].rc);
cout<<")";
}else{
if(tree[x].lc!=-1) dfs(tree[x].lc);
if(tree[x].rc!=-1) dfs(tree[x].rc);
cout<<tree[x].dat;
cout<<")";
}
} int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>tree[i].dat>>tree[i].lc>>tree[i].rc;
if(tree[i].lc != -1) vis[tree[i].lc] = 1;
if(tree[i].rc != -1) vis[tree[i].rc] = 1;
}
int root = 1;
for(int i=1;i<=n;i++){ //先确定 根的结点 没有当过
if(!vis[i]) root = i;
}
dfs(root);
return 0;
}

7-4最短路 30

#include<bits/stdc++.h>
using namespace std; const int inf = 0x3f3f3f3f;
const int maxn = 1e3+10;
const int maxm = 1e5+10;
struct edge{
int v;
int w;
edge(int vv,int ww){
v = vv;
w = ww;
}
}; vector<edge> g[maxn];
int n,e,k;
int di[maxn];
int dist[maxn];
int vis[maxn]; bool dijkstra(int s){
memset(dist,inf,sizeof(dist));
memset(vis,0,sizeof(vis));
dist[s] = 0;
for(int i=1;i<=n;i++){
int v,min_w = inf;
for(int j=1;j<=n;j++){
if(!vis[j] && dist[j] < min_w){
v = j;
min_w = dist[j];
}
}
if(min_w == inf) return false;
vis[v] = 1;
for(int j=0;j<g[v].size();j++){
int x = g[v][j].v;
int w = g[v][j].w;
if(!vis[x] && dist[x] >dist[v] + w){
dist[x] = dist[v] + w;
}
}
}
return true;
}
int vis2[maxn];
bool solve(){
memset(vis2,0,sizeof(vis2));
vis2[di[1]] = 1;
for(int i=2;i<=n;i++){
int mind = inf;
for(int j=1;j<=n;j++){
if(!vis2[j] && dist[j] <= mind){
mind = dist[j];
}
}
if(mind != dist[di[i]])
return false;
vis2[di[i]] = 1;
}
return true;
} void solve2(){
int visit[n + 1];
for (int i = 1; i <= n; i++) visit[i] = 0;
int start = di[1];
visit[start] = 1;
bool flag = false;
for (int i = 2; i <= n; i++) {
int mine = dist[di[i]];
visit[di[i]] = 1;
for (int j = 1; j <= n; j++) {
if (visit[di[j]]) continue;
int curv = dist[di[j]];
if (mine >= curv) mine = curv;
}
if (mine < dist[di[i]]) {
cout << "No" << endl;
flag = true;
break;
}
}
if (flag == false) cout << "Yes" << endl;
} int main(){
cin>>n>>e;
for(int i=1;i<=e;i++){
int u,v,w;
cin>>u>>v>>w;
g[u].push_back(edge(v,w));
g[v].push_back(edge(u,w));
}
cin>>k;
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++) cin>>di[j];
int st = di[1];
dijkstra(st);
// solve2();
if(solve()){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
return 0;
}

PAT(甲级)2019年秋季考试的更多相关文章

  1. PAT甲级2019冬季考试题解

    A Good In C纯模拟题,用string数组读入数据,注意单词数量的判断 #include<bits/stdc++.h> using namespace std; ; ][]; in ...

  2. PAT甲级满分攻略|记一次考试经历

    一次考试经历 今天是"大雪",很冷. 来到隔壁的学校考试,记得上一次来河中医是两年前大一刚开学吧,那天晚上印象比较深刻,6个室友骑车到处闲逛.当时还不会Hello world. 很 ...

  3. 2019秋季PAT甲级_备考总结

    2019 秋季 PAT 甲级 备考总结 在 2019/9/8 的 PAT 甲级考试中拿到了满分,考试题目的C++题解记录在这里,此处对备考过程和考试情况做一个总结.如果我的方法能帮助到碰巧点进来的有缘 ...

  4. PAT(甲级)2017年秋季考试

    PAT(甲级)2017年秋季考试 D题红黑树待补21/30 大佬的代码,看着想哭,这才是艺术啊 A Cut Integer 模拟题 #include<bits/stdc++.h> usin ...

  5. 2019秋季PAT甲级_C++题解

    2019 秋季 PAT (Advanced Level) C++题解 考试拿到了满分但受考场状态和知识水平所限可能方法不够简洁,此处保留记录,仍需多加学习.备考总结(笔记目录)在这里 7-1 Fore ...

  6. PAT甲级考前整理(2019年3月备考)之三,持续更新中.....

    PAT甲级考前整理一:https://www.cnblogs.com/jlyg/p/7525244.html,主要讲了131题的易错题及坑点 PAT甲级考前整理二:https://www.cnblog ...

  7. PAT甲级考前整理(2019年3月备考)之一

       转载请注明出处:https://www.cnblogs.com/jlyg/p/7525244.html 终于在考前,刷完PAT甲级131道题目,不容易!!!每天沉迷在刷题之中而不能超脱,也是一种 ...

  8. 2021.9.12周六PAT甲级考试复盘与总结

    周六PAT甲级考试复盘与总结 先说结论:仍未步入"高手"行列:现在的学习节奏与方法是对的,有十万分的必要坚持下去. 题目 知识点 分数 T1 前缀和.二分 11 / 20 T2 排 ...

  9. pat甲级考试+pat1051+1056

    同上一篇博客: 贪心题目我已经刷了将近30道了,由于那几天考驾照就没写,以后有空的时候补过来吧,都在codeblock里 pat的题也刷了点,acwing 的题也刷了点,基本都攒下了.以后也会慢慢补过 ...

随机推荐

  1. Vs使用EF来操作MySql(经验 )

    1.安装Vs2015,至少是2012以上版本才行 2. 安装 这个是用于连接Mysql数据库的Vs插件 2.1通过这种方式添加引用 3.配置数据库 // // // 4.添加实体 注:这里最好从数据库 ...

  2. LeetCode 11月第1周题目汇总

    开源地址:点击该链接 前言 最近一个多月发现以[每天一题]系列的形式来更新题目并不太合适,一是没有足够多合适的题目来更新,二是单独拿出来一个题来讲不太系统,应该把多个相似的题目放在一起讲,这样才能够达 ...

  3. 小白学 Python(19):基础异常处理

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  4. 「每日五分钟,玩转 JVM」:GC 概览

    前言 GC(Garbage Collection)是我们在学习 JVM 的过程中不可避免的一道坎,接下来,我们就来系统的学习一下 GC. 做一件事情之前,我们一定要去知道我们为什么要去做,这里不仅仅指 ...

  5. go中的数据结构字典-map

    1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定 ...

  6. SAP HCM 评估路径

    一.评估路径的配置方法: 1)IMG菜单路径:人事管理-〉组织管理-〉基本设置-〉维护评估路径:   2)首先定义评估路径的名称和描述,客户自定义的评估路径的名称编码可以采用字母数字编码,最大长度是八 ...

  7. PHP队列的实现详细操作步骤

    队列是一种特殊的线性表,它只允许在表的前端,可以称之为front,进行删除操作:而在表的后端,可以称之为rear进行插入操作.队列和堆栈一样,是一种操作受限制的线性表,和堆栈不同之处在于:队列是遵循“ ...

  8. xposed实现个人收款免签支付

    想必很多程序员都有这样的烦恼,想做个人网站,但如何实现收款功能? 今天我就给大家分享一下我的实现方案:基于xposed逆向框架实现微信免签支付.支付宝免签支付 接下来给大家简单分享一下实现过程,这个过 ...

  9. 编写 Dockerfile 最佳实践

    官方仓库虽然有数十万计的免费镜像,但大多数无法直接满足公司业务需求,这就需要我们自己去定制镜像了. Docker通过Dockerfile自动构建镜像,Dockerfile是一个包含用于组建镜像的文本文 ...

  10. Netty创建服务器与客户端

    Netty 创建Server服务端 Netty创建全部都是实现自AbstractBootstrap.客户端的是Bootstrap,服务端的则是ServerBootstrap. 创建一个 HelloSe ...