1019. General Palindromic Number

  题意:求数N在b进制下其序列是否为回文串,并输出其在b进制下的表示。

  思路:模拟N在2进制下的表示求法,“除b倒取余”,之后判断是否回文。

 #include<iostream>
#include<cstdio>
using namespace std;
int Base[];
int main()
{
int n, b;
scanf("%d%d", &n, &b);
int len = , tmp = n,yu=tmp%b;
while (tmp / b)
{
Base[len++] = yu;
tmp = tmp / b;
yu = tmp % b;
}
Base[len++] = yu;
bool flag = true;
for (int i = , j = len - ; i <= j&&flag; i++, j--)
{
if (Base[i] != Base[j]) flag = false;
}
if (flag) printf("Yes\n");
else printf("No\n");
for (int i = len - ; i >= ; i--)
{
printf("%d", Base[i]);
if (i) printf(" ");
}
printf("\n");
return ;
}

1020. Tree Traversals

  题意:给出二叉树的后序遍历和中序遍历,求层次遍历。

  思路:通过后序遍历和中序遍历建立二叉树,然后对二叉树进行BFS。

 #include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
const int maxn = ;
int postOrder[maxn];
int inOrder[maxn];
int L[maxn],R[maxn];
int treeRoot;
queue<int>q;
int createBinTree(int pt_pl,int pt_pr,int pt_i,int n)
{
if (n == ) return -;
int k = pt_i,curRoot= postOrder[pt_pr];
while (curRoot!= inOrder[k])k++;//在中序中找到当前子树的根
L[curRoot] = createBinTree(pt_pl,pt_pl+(k- pt_i)-,pt_i, k-pt_i);
R[curRoot] = createBinTree(pt_pl + (k - pt_i),pt_pr-,k+,n - (k-pt_i) - );
return curRoot;
}
void printLevelOrder(int root)
{
q.push(root);
while (!q.empty())
{
int u = q.front();
q.pop();
if (u == treeRoot) printf("%d", u);
else printf(" %d", u);
if (L[u] != -) q.push(L[u]);
if (R[u] != -) q.push(R[u]);
}
printf("\n");
} int main()
{
int n;
scanf("%d", &n);
for (int i = ; i < n; i++) scanf("%d", postOrder + i);
for (int i = ; i < n; i++) scanf("%d", inOrder + i);
treeRoot = postOrder[n-];
createBinTree(,n - , , n);
printLevelOrder(treeRoot);
return ;
}

1021. Deepest Root

  题意:给出n个点和n-1条边。若是只有一个连通分量,且为无环图,则可将其看成一棵树,求拥有最大深度的树的所有根,并按字典序升序输出。否则输出连通块的数目。

  思路:并查集求连通块;DFS判断是否有环(傻了,如果只有1个连通块,则因为边数只有n-1条,只能是无环图);BFS求树的深度。可通过连续两次BFS求出树的最大直径。

 #include<iostream>
#include<set>
#include<queue>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = ;
int pre[maxn],cnt_cpt;
set<int>ans;
int lvl[maxn];
bool vis[maxn];
struct edge
{
int to,next;
edge(int tt=,int nn=):to(tt),next(nn){}
};
edge Edge[maxn << ];
int Head[maxn], totedge;
void addedge(int from, int to)
{
Edge[totedge] = edge(to, Head[from]);
Head[from] = totedge++;
Edge[totedge] = edge(from, Head[to]);
Head[to] = totedge++; }
int max_deep;
int Find(int x)
{
if (pre[x] == x) return x;
else
{
int fa = pre[x];
pre[x] = Find(fa);
return pre[x];
}
}
void Join(int u, int v)
{
int fu = Find(u), fv = Find(v);
if (fu != fv)
{
if (fv > fu) fv ^= fu, fu ^= fv, fv ^= fu;
pre[fu] = fv;
cnt_cpt--;
}
}
void BFS(int u)
{
vis[u] = true;
queue<int>q;
q.push(u);
while (!q.empty())
{
int v = q.front();
q.pop();
for (int i = Head[v]; i != -; i = Edge[i].next)
{
int t = Edge[i].to;
if (!vis[t])
{
vis[t] = true;
lvl[t] = lvl[v] + ;
if (lvl[t] > max_deep) max_deep = lvl[t];
q.push(t);
}
}
}
}
//bool DFS(int u,int pre)
//{
// vis[u] = true;
// for (int i = Head[u]; i != -1; i = Edge[i].next)
// {
// int v = Edge[i].to;
// if (v == pre) continue;
// if (vis[v]) return true;
// else
// {
// bool flag = DFS(v, u);
// if (flag) return true;
// }
// }
// vis[u] = false;
// return false;
//}
int main()
{
int n;
scanf("%d", &n); for (int i = ; i <= n; i++) pre[i] = i;
cnt_cpt = n;
totedge = ;
memset(Head, -, sizeof(Head)); for (int i = ; i < n; i++)
{
int u, v;
scanf("%d%d", &u, &v);
Join(u, v);
addedge(u, v);
}
if (cnt_cpt > )
{
printf("Error: %d components\n", cnt_cpt);
}
else
{
max_deep = ;
BFS();
int next_root;
for (int i = ; i <= n; i++)if (lvl[i] == max_deep) ans.insert(i), next_root=i;
max_deep = ;
memset(lvl, , sizeof(lvl));
memset(vis, , sizeof(vis));
BFS(next_root);
for(int i=;i<=n;i++)if (lvl[i] == max_deep) ans.insert(i);
int sz = ans.size();
set<int>::iterator it = ans.begin();
for (; it != ans.end(); it++)
{
printf("%d\n", *it);
}
}
return ;
}

1022. Digital Library

  题意:给出n个图书信息:ID、title、author、key words、publisher、publish year.之后有m个询问,求指定title/author/key word/publisher/publish year的图书的ID。

  思路:用map建立title、author、key word、publisher、publish year到ID的映射,用set存放被映射的ID。

  一些技巧:sstream的使用、用fgets(str,size,stdin)或scanf("%[^\n]")读入一行带有空格的字符串(注意用getchar()吸收‘\n’).

 #include<iostream>
#include<map>
#include<set>
#include<string>
#include<sstream>
#include<cstdio>
using namespace std; map<string, set<string> >mp[];
char tmp[];
string id,t1,t2;
int main()
{
int n;
scanf("%d", &n);
for (int i = ; i < n; i++)
{
scanf("%s", tmp);//ID,fgets(tmp,90,stdin);
id = tmp;
getchar();
scanf("%[^\n]", tmp);//title
mp[][tmp].insert(id);
getchar();
scanf("%[^\n]", tmp);//author
mp[][tmp].insert(id);
getchar();
scanf("%[^\n]", tmp);//key words
stringstream sss((t1=tmp));
while (sss >> t2) mp[][t2].insert(id);
getchar();
scanf("%[^\n]", tmp);//publisher
mp[][tmp].insert(id);
getchar();
scanf("%[^\n]", tmp);//year
mp[][tmp].insert(id);
}
int m;
scanf("%d", &m);
for (int i = ; i <= m; i++)
{
getchar();
scanf("%[^\n]", tmp);
printf("%s\n", tmp);
set<string>&st = mp[tmp[] - ''][tmp + ];
if (st.size() == ) printf("Not Found\n");
else
{
set<string>::iterator it = st.begin();
for (; it != st.end(); it++)
{
printf("%s\n", (*it).c_str());
}
}
}
return ;
}

1023. Have Fun with Numbers

  题意:将给出的一个大数*2,判断其是否可由原来的数通过排列得到。

  思路:数组模拟大数*2.

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char str[],dst[];
int main()
{
scanf("%s", str + );
int len = strlen(str + );
int tadd = ;
for (int i = len; i >= ; i--)
{
tadd += *(str[i] - '');
dst[i] = ''+tadd % ;
tadd /= ;
}
if (tadd) dst[] = ''+tadd;
dst[len + ] = '\0';
if (tadd) printf("No\n%s\n",dst);
else
{
bool flag = true;
for (int i = ; i <= ; i++)
{
int c1 = ,c2 = ;
for (int j = ; j <= len; j++) if (str[j] == '' + i)c1++;
for (int j = ; j <= len; j++) if (dst[j] == '' + i) c2++;
if (c1 != c2)
{
printf("No\n");
flag = false;
break;
}
}
if (flag) printf("Yes\n");
printf("%s\n", dst + );
}
return ;
}

1024. Palindromic Number

  题意:给出一个<=10^10的数,每次将其颠倒后与原数相加,若结果为回文数,则输出对应的数和颠倒的次数。

  思路:用字符串数组模拟大数加法。

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
char init[], dst[],ans[];
void Reverse()
{
reverse_copy(init, init + strlen(init), dst);
return;
}
void Add()
{
int len = strlen(init);
int pos = len, tmp = ;
for (int i = len - ; i >= ; --i)
{
tmp += init[i] - '' + dst[i] - '';
ans[pos--] = '' + tmp % ;
tmp /= ;
}
int st, ed = len;
if (tmp) ans[pos] = '' + tmp, st = ;
else ans[pos] = '\0', st = ;
ans[ed + ] = '\0';
memcpy(init, ans + st, ed - st + );
}
bool isPar()
{
int len = strlen(init);
for (int i = len-; i >=len/; i--)
{
if (init[i] != init[len - i-])
{
return false;
}
} return true;
}
int main()
{
long long n, k;
scanf("%s%lld", init, &k);
long long cur = ;
while (!isPar())
{
if (cur == k) break;
cur++;
Reverse();
Add();
}
printf("%s\n%lld\n", init, cur);
return ;
}

1025. PAT Ranking

  题意:有若干子测试,每个子测试中有ki个人,给出其编号和成绩。现在需要你给出最终的成绩排名,给出每个人的编号、最终排名、子测试序号、子测试排名。

  思路:vector应用。用merge对多个vector合并;用assign来对vector赋值。

 #include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
string id;
int score;
int loc_num;
int loc_rank;
node(string ii="",int ss=,int ln=,int lr=):id(ii),score(ss),loc_num(ln),loc_rank(lr){}
};
vector<node>ans;
bool Cmp(node&a, node&b)
{
if (a.score == b.score) return a.id < b.id;
else return a.score > b.score;
}
char ID[];
int main()
{
int n;
scanf("%d", &n);
int loc_num = ;
while (n--)
{
int k;
scanf("%d", &k);
vector<node>tmp;
for (int i = ; i < k; i++)
{
int score;
scanf("%s%d", ID, &score);
tmp.push_back(node(ID, score,loc_num));
}
sort(tmp.begin(), tmp.end(), Cmp);
vector<node>::iterator it = tmp.begin();
int pre = -,cnt=,prer;
for (; it != tmp.end(); it++)
{
if (pre==-||it->score < pre) it->loc_rank =prer= ++cnt,pre=it->score;
else it->loc_rank = prer,cnt++;
}
vector<node>tans;
tans.resize(ans.size() + tmp.size());
merge(ans.begin(), ans.end(), tmp.begin(), tmp.end(), tans.begin(),Cmp);
ans.clear();
ans.assign(tans.begin(), tans.end());
loc_num++;
}
printf("%d\n", ans.size());
int prescore = -, prer, cnt = ;
vector<node>::iterator it = ans.begin();
for (; it != ans.end(); it++)
{
printf("%s", it->id.c_str());
if (prescore == - || it->score < prescore)
{
prer = ++cnt;
prescore = it->score;
}
else cnt++;
printf(" %d", prer);
printf(" %d %d\n", it->loc_num, it->loc_rank);
}
return ;
}

1026. Table Tennis

  题意:有k个台球桌,其中有m个为VIP桌。该台球室营业时间为9:00:00到21:00:00。有若干pair来该台球室打球。如果台球桌已满人,否则使用编号最小的台球桌。这些人当中有VIP用户。如果在等待时有个台球桌刚好空出来,且为VIP桌,则VIP用户可率先使用,有多个VIP用户时按到达时间的顺序使用。给出该台球室按每个桌子的开始服务时间排序的使用情况(所服务pair的到来时间、开始服务时间、等待时间),并给出每个桌子服务pair数目。

  思路:优先队列维护当前可使用的台球桌,对用户的到来时间进行排序。如果到来有桌子为空,则可立马使用;否则入等待队列;等待时若有桌子空出,则若其为VIP桌且等待队伍中有VIP用户,则由该VIP用户先用,否则由队伍的第一个人使用。

  注意:对等待时间四舍五入;每个pair的使用时间最多2小时;不在营业时间到来的客户或者营业时间结束停止服务。

 #include<iostream>
#include<vector>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
int ar_time;
int pl_time;
bool vip;
node(int aa = , int pp = , bool vv = false) :ar_time(aa), pl_time(pp), vip(vv) {}
};
vector<node>customers;
vector<node>waitVec;
int tables[];
int viptab[];
struct tab
{
int endtime;
int id;
tab(int ee = , int ii = ) :endtime(ee), id(ii) {}
};
vector<tab>pq;
bool Cmp2(const tab&a, const tab&b)
{
if (a.endtime == b.endtime)
{
return a.id > b.id;
}
else return a.endtime > b.endtime;
}
bool Cmp(node&a, node&b)
{
return a.ar_time < b.ar_time;
}
char ar[];
int exChange()
{
return ar[] - '' + (ar[] - '') * + (ar[] - '') * + (ar[] - '') * * + (ar[] - '') * + (ar[] - '') * * ;
}
void int2str(int time)
{
ar[] = '' + time / / ;
ar[] = '' + time / % ;
time -= (ar[] - '') * + (ar[] - '') * * ;
ar[] = '' + time / / ;
ar[] = '' + time / % ;
time -= (ar[] - '') * + (ar[] - '') * * ;
ar[] = '' + time / ;
ar[] = '' + time % ;
ar[] = ar[] = ':';
ar[] = '\0';
} void run(int ttime)
{
tab ff = pq.front();
while (ff.endtime < ttime&&waitVec.size())
{ int index = ;
node cur = waitVec[];
bool isvip_inwait = false;
vector<node>::iterator it = waitVec.begin();
for (; it != waitVec.end(); it++)
{
if (it->vip)
{
index = it - waitVec.begin();
cur = waitVec[index];
isvip_inwait = true;
break;
}
}
if (isvip_inwait)
{
vector<tab>::iterator itab = pq.begin();
for (; itab != pq.end(); itab++)
{
if (itab->endtime == ff.endtime)
{
if (viptab[itab->id])
{
int tt = ff.id;
ff.id =pq.begin()->id=itab->id;
itab->id = tt;
break;
}
}
}
}
if(!viptab[ff.id]) index = ,cur = waitVec[]; int2str(cur.ar_time);
printf("%s", ar);
if (ff.endtime >= cur.ar_time)int2str(ff.endtime);
int waitTime = ((ff.endtime <= cur.ar_time) ? : ff.endtime - cur.ar_time);
printf(" %s %d\n", ar, (waitTime + ) / );
waitVec.erase(waitVec.begin() + index);
pop_heap(pq.begin(), pq.end(), Cmp2);
pq.pop_back();
int endTime = ((ff.endtime <= cur.ar_time) ? cur.ar_time + cur.pl_time : ff.endtime + cur.pl_time);
pq.push_back(tab(endTime, ff.id));
push_heap(pq.begin(), pq.end(), Cmp2);
tables[ff.id]++;
ff = pq.front();
}
}
int main()
{
int n, Count = ;
int st = * , ed = * ;
scanf("%d", &n);
for (int i = ; i <= n; i++)
{
int pl, vip;
scanf("%s%d%d", ar, &pl, &vip);
if (pl > ) pl = ;
pl = pl * ;
int artime = exChange();
if (artime >= ed) continue;
customers.push_back(node(artime, pl, vip));
Count++;
}
sort(customers.begin(), customers.end(), Cmp);
int k, m;
scanf("%d%d", &k, &m);
for (int i = ; i <= m; i++)
{
int id;
scanf("%d", &id);
viptab[id] = ;
} for (int i = ; i <= k; i++)
{
pq.push_back(tab(st, i));
}
make_heap(pq.begin(), pq.end(), Cmp2);
for (int i = ; i < Count;)
{
tab ff = pq.front();
if (waitVec.size() == || customers[i].ar_time <= ff.endtime)
{
waitVec.push_back(customers[i]);
i++;
}
else
{
run(customers[i].ar_time);
}
}
run(ed);
for (int i = ; i <= k; i++)
{
if (i> ) printf(" ");
printf("%d", tables[i]);
}
printf("\n");
return ;
}

1027. Colors in Mars

  题意:把给出的3个十进制数转为3个2为13进制数。

  思路:对13整除和取余。

 #include<iostream>
#include<cstdio>
using namespace std;
char color[];
int main()
{
for (int i = ; i < ; i++)
{
int v;
scanf("%d", &v);
color[i * ] = ((v / <= ) ? '' + v / : 'A' + v / - );
color[i * + ] = ((v % <= ) ? '' + v % : 'A' + v % - );
}
printf("#%s\n", color);
return ;
}

PAT 甲级真题的更多相关文章

  1. PAT 甲级真题题解(1-62)

    准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format  模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...

  2. 1080 Graduate Admission——PAT甲级真题

    1080 Graduate Admission--PAT甲级练习题 It is said that in 2013, there were about 100 graduate schools rea ...

  3. PAT甲级真题及训练集

    正好这个"水水"的C4来了 先把甲级刷完吧.(开玩笑-2017.3.26) 这是一套"伪题解". wacao 刚才登出账号测试一下代码链接,原来是看不到..有空 ...

  4. PAT 甲级真题题解(63-120)

    2019/4/3 1063 Set Similarity n个序列分别先放进集合里去重.在询问的时候,遍历A集合中每个数,判断下该数在B集合中是否存在,统计存在个数(分子),分母就是两个集合大小减去分 ...

  5. PAT甲级真题 A1025 PAT Ranking

    题目概述:Programming Ability Test (PAT) is organized by the College of Computer Science and Technology o ...

  6. Count PAT's (25) PAT甲级真题

    题目分析: 由于本题字符串长度有10^5所以直接暴力是不可取的,猜测最后的算法应该是先预处理一下再走一层循环就能得到答案,所以本题的关键就在于这个预处理的过程,由于本题字符串匹配的内容的固定的PAT, ...

  7. 1018 Public Bike Management (30分) PAT甲级真题 dijkstra + dfs

    前言: 本题是我在浏览了柳神的代码后,记下的一次半转载式笔记,不经感叹柳神的强大orz,这里给出柳神的题解地址:https://blog.csdn.net/liuchuo/article/detail ...

  8. 1022 Digital Library——PAT甲级真题

    1022 Digital Library A Digital Library contains millions of books, stored according to their titles, ...

  9. PAT甲级真题打卡:1001.A+B Format

    题目: Calculate a + b and output the sum in standard format -- that is, the digits must be separated i ...

随机推荐

  1. CentOS下搭建wordpress全流程

    突然,想搭建一个个人博客,所以就在网上搜了搜相关内容,好多人推荐wordpress,那么就打算光荣地采用wordpress了.以下是安装过程中遇到的所有的坑,现在总结如下,希望给安装wordpress ...

  2. 使用JSP实现用户登录

    本文讲述使用JSP实现用户登录,包括用户登录.注册和退出功能等. 1.系统用例图 2.页面流程图 3.数据库设计 本例使用oracle数据库 创建用户表 包括id,username,password和 ...

  3. Python爬虫学习笔记(一)

    1.urllib2简介 urllib2的是爬取URL(统一资源定位器)的Python模块.它提供了一个非常简单的接口,使用urlopen函数.它能够使用多种不同的协议来爬取URL.它还提供了一个稍微复 ...

  4. linux常用指令--防火墙

    centos7 iptables :  如果你想使用iptables静态路由规则,那么就禁用centos7默认的firewalld,并安装ipteables-services, 启用iptables和 ...

  5. ifconfig配置网络时,出现“SIOCSIFADDR: No such device”

    最近刚学习linux,参考教学视频,试着使用ifconfig命令来设置网卡参数,命令为“ifconfig eth0 192.168.11.2”. 但结果显示“SIOCSIFADDR: No such ...

  6. c#检查网络文件是否存在

    public bool IsExist(string uri) { HttpWebRequest req = null; HttpWebResponse res = null; try { req = ...

  7. JavaScript 严格模式(use strict)

    前言: "use strict" 指令在 JavaScript 1.8.5 (ECMAScript5) 中新增. 它不是一条语句,但是是一个字面量表达式,在 JavaScript ...

  8. JMETER 不同线程组 变量值 的参数传递(转)

    线程组 1   在线程组1中使用__setProperty函数设置jmeter属性值(此值为全局变量值),将所需变量值如${token}设置为jmeter属性值,即newtoken,示例: 1.添加- ...

  9. Lingo (Spring Remoting) : Passing client credentials to the server

    http://www.jroller.com/sjivan/entry/lingo_spring_remoting_passing_client Lingo (Spring Remoting) : P ...

  10. 五月的仓颉大神写的 三年java程序员面试感悟 值得分享给大家

    感谢 五月的仓颉  的这篇文章 , 让我重新认识到自己身上的不足之处 .  原文地址http://www.cnblogs.com/xrq730/p/5260294.html,转载请注明出处,谢谢! 前 ...