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. ssh密码登陆的原理,密码的公私钥和sshkey的不是一回事

    密码登录的原理: 密钥加密: 创建分发密钥.分发到服务端的ssh-copy-id的本质是拷贝公钥到对面服务器的,authorized_keys文件下就会多了一个密钥文件信息.就会被拷贝入下面. 客户端 ...

  2. JDK7 Garbage Frist

    JDK7 G1新型垃圾回收器. http://www.infoq.com/cn/articles/jdk7-garbage-first-collector

  3. JDK8集合的便捷操作

    JDK8新特性,stream相关操作.把集合转换成stream,再对其进行相关操作,加上lambada表达式. demo: List<String> list = Arrays.asLis ...

  4. bgr to rgb

    因为在研究车牌识别算法(plr),遇到了算法 处理的格式问题,可分三个常用格式: 0:rgb 1:bgr 2:yuv422——需要注意的是,这里为啥选yuv422做识别,当然还可选yuv444,最坏打 ...

  5. _beginthreadex创建线程,立即执行?

    一个线程创建后,并不是立马就执行,而是等时间片到来后才执行...  C++ Code  12345678910111213141516171819202122232425262728293031323 ...

  6. 怎样使用Intent传递对象

    怎样使用Intent传递对象 我们能够使用Intent来启动Activity.开启服务Service,发送广播Broadcast,然后使用Intent传递主要的数据类型,如:布尔值,整型,字符串等 I ...

  7. Tomcat unable to start within 45 seconds.

    解决的方法当然是设定这个时间,让其大于45秒,修改在当前项目所在的workspace\.metadata\.plugins\org.eclipse.wst.server.core\servers.xm ...

  8. python 之 re模块(正则表达式)

    一.起源(历史) 正则表达式的“鼻祖”或许可一直追溯到科学家对人类神经系统工作原理的早期研究.美国新泽西州的Warren McCulloch和出生在美国底特律的Walter Pitts这两位神经生理方 ...

  9. 160622、详解JavaScript变量提升

    变量在程序中随处可见.它们是一些始终在相互影响,相互作用的的数据和逻辑.正是这些互动使应用程序活了起来. 在JavaScript中使用变量很重要的一方面就是变量的提升 —— 它决定了一个变量何时可以被 ...

  10. GIT界的神探--bisect

    GIT界的神探--bisect 今天我们需要使用git命令中的bisect破获一起凶杀案,下面请看具体案件: 在一个git仓库中有a,b,c,d,e,f,g,h,i,j,k这几个提交,在k提交中发现软 ...