由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz

总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~

L1-1 N个数求和

设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可。

 #include <cstdio>

 long long abs(long long x)
{
return x < ? -x : x;
} long long gcd(long long a, long long b)
{
if (b == )
return a;
else if (a > b)
return gcd(b, a % b);
else
return gcd(a, b % a);
} struct FS
{
long long fz, fm;
FS(long long _fz = , long long _fm = )
{
fz = _fz;
fm = _fm;
if (fz & fm)
{
long long g = gcd(abs(fz), abs(fm));
fz /= g;
fm /= g;
}
}
friend FS operator+ (const FS& a, const FS& b)
{
FS ans;
long long lcm = a.fm / gcd(abs(a.fm), abs(b.fm)) * b.fm;
ans.fz = a.fz * (lcm / a.fm) + b.fz * (lcm / b.fm);
ans.fm = lcm;
if (ans.fz && ans.fm)
{
long long g = gcd(abs(ans.fz), abs(ans.fm));
ans.fz /= g;
ans.fm /= g;
}
return ans;
}
}; int main()
{
int n;
scanf("%d", &n);
FS ans;
char buf[];
while (n--)
{
scanf("%s", buf);
long long fz, fm;
sscanf(buf, "%lld/%lld", &fz, &fm);
ans = ans + FS(fz, fm);
}
if (ans.fz == )
printf("");
else if (abs(ans.fz) < abs(ans.fm))
printf("%lld/%lld", ans.fz, ans.fm);
else
{
if (ans.fz % ans.fm == )
printf("%lld", ans.fz / ans.fm);
else
printf("%lld %lld/%lld", ans.fz / ans.fm, ans.fz % ans.fm, ans.fm);
}
return ;
}

L1-2 比较大小

太水了,不解释,直接sort一下。

 #include <cstdio>
#include <algorithm>
using namespace std; int main()
{
int a[];
scanf("%d%d%d", a, a + , a + );
sort(a, a + );
printf("%d->%d->%d", a[], a[], a[]);
return ;
}

L1-3 A-B

用一个bool数组记录第二个字符串中出现的字符,然后遍历第一个字符串,检测是否在第二个字符串中出现过。

 #include <cstdio>
#include <algorithm>
using namespace std; char s1[];
char s2[];
bool vis[]; int main()
{
gets(s1);
gets(s2);
int idx = -;
while (s2[++idx])
vis[s2[idx]] = true;
idx = -;
while (s1[++idx])
if (!vis[s1[idx]])
putchar(s1[idx]);
return ;
}

L1-4 计算指数

太水了,直接左移位。

 #include <cstdio>
#include <algorithm>
using namespace std; int main()
{
int n;
scanf("%d", &n);
printf("%d^%d = %d", , n, << n);
return ;
}

L1-5 计算阶乘和

太水了,求阶乘累加。

 #include <cstdio>
#include <algorithm>
using namespace std; int main()
{
int n;
scanf("%d", &n);
int sum = ;
int fact = ;
for (int i = ; i <= n; i++)
sum += fact *= i;
printf("%d", sum);
return ;
}

L1-6 简单题

hello world同级别的题。

 #include <cstdio>
int main()
{
printf("This is a simple problem.");
return ;
}

L1-7 跟奥巴马一起画方块

双重循环。

 #include <cstdio>
#include <algorithm>
using namespace std; int main()
{
int n;
char c[];
scanf("%d%s", &n, c);
for (int i = ; i < (n + ) / ; i++, puts(""))
for (int j = ; j < n; j++)
putchar(c[]);
return ;
}

L1-8 查验身份证

按规则模拟就好了,注意判断前17位有无非数字。

 #include <cstdio>
#include <algorithm>
using namespace std; int wei[] = {,,,,,,,,,,,,,,,,};
int rlt[] = {,,-,,,,,,,,}; bool check(char *s)
{
int sum = ;
for (int i = ; i < ; i++)
{
if (!isdigit(s[i]))
return false;
sum += (s[i] - '') * wei[i];
}
sum %= ;
if (rlt[sum] == -)
return s[] == 'X';
else
return s[] - '' == rlt[sum];
} int main()
{
int n;
char s[];
scanf("%d", &n);
bool allpass = true;
while (n--)
{
scanf("%s", s);
if (!check(s))
{
puts(s);
allpass = false;
}
}
if (allpass)
puts("All passed");
return ;
}

L2-1 集合相似度

排序后,对于每个询问二分好像会超时一组数据。那么我们可以把那些数字离散化&去重之后,用hash思想来做,O(M)复杂度处理每个查询。

 #include <cstdio>
#include <algorithm>
using namespace std; int sorted[];
int sset[][];
bool vis[];
int rec[]; int main()
{
int n;
scanf("%d", &n);
int tot = ;
for (int i = ; i < n; i++)
{
scanf("%d", &sset[i][]);
for (int j = ; j <= sset[i][]; j++)
scanf("%d", &sset[i][j]), sorted[tot++] = sset[i][j];
sort(sset[i] + , sset[i] + + sset[i][]);
sset[i][] = unique(sset[i] + , sset[i] + + sset[i][]) - sset[i] - ;
}
sort(sorted, sorted + tot);
tot = unique(sorted, sorted + tot) - sorted;
for (int i = ; i < n; i++)
for (int j = ; j <= sset[i][]; j++)
sset[i][j] = lower_bound(sorted, sorted + tot, sset[i][j]) - sorted;
int k;
scanf("%d", &k);
while (k--)
{
int a, b;
scanf("%d%d", &a, &b);
a--, b--;
int nc = , nt = ;
int reccnt = ;
for (int i = ; i <= sset[a][]; i++)
vis[sset[a][i]] = true, rec[reccnt++] = sset[a][i];
nt = sset[a][];
for (int i = ; i <= sset[b][]; i++)
{
rec[reccnt++] = sset[b][i];
if (vis[sset[b][i]])
nc++;
else
nt++;
}
for (int i = ; i < reccnt; i++)
vis[rec[i]] = false;
printf("%.2f%\n", 1.0 * nc / nt * );
}
return ;
}

L2-2 树的遍历

后序序列最后一个是根节点,用那个根节点把中序序列分开,然后递归建树,最后再宽搜一下。

 #include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std; vector<int> tree[];
int n;
int hx[];
int zx[]; int deal(int lz, int rz, int lh, int rh)
{
if (lz > rz || lh > rh)
return -;
int root = hx[rh];
int pos = find(zx + lz, zx + rz + , root) - zx;
int cnt = pos - lz;
tree[root].push_back(deal(lz, pos - , lh, lh + cnt - ));
tree[root].push_back(deal(pos + , rz, lh + cnt, rh - ));
return root;
} int main()
{
scanf("%d", &n);
for (int i = ; i < n; i++)
scanf("%d", hx + i);
for (int i = ; i < n; i++)
scanf("%d", zx + i);
int root = deal(, n - , , n - );
queue<int> q;
q.push(root);
bool flag = false;
while (!q.empty())
{
int cur = q.front();
q.pop();
if (flag)
printf(" %d", cur);
else
printf("%d", cur), flag = true;
if (tree[cur][] != -)
q.push(tree[cur][]);
if (tree[cur][] != -)
q.push(tree[cur][]);
}
return ;
}

L2-3 家庭房产

思路很简单,就是普通的并查集,但是代码不太好写哦~

#include <cstdio>
#include <algorithm>
using namespace std; struct Node
{
int parent;
int ts, mj;
};
struct Result
{
int minid;
int siz;
int ts, mj;
friend bool operator< (const Result& a, const Result& b)
{
if (1LL * a.mj * b.siz == 1LL * b.mj * a.siz)
return a.minid < b.minid;
return 1LL * a.mj * b.siz > 1LL * b.mj * a.siz;
}
};
Node node[];
Result rlt[]; int uf_find(int x)
{
if (node[x].parent == x)
return x;
return node[x].parent = uf_find(node[x].parent);
} void uf_union(int x, int y)
{
x = uf_find(x);
y = uf_find(y);
if (x != y)
node[x].parent = y;
} int main()
{
int n;
scanf("%d", &n);
for (int i = ; i < ; i++)
node[i].parent = i, rlt[i].minid = ;
while (n--)
{
int id, f, m, k, hz;
scanf("%d%d%d%d", &id, &f, &m, &k);
if (f != -)
uf_union(f, id);
if (m != -)
uf_union(m, id);
for (int i = ; i < k; i++)
{
scanf("%d", &hz);
uf_union(hz, id);
}
scanf("%d%d", &node[id].ts, &node[id].mj);
}
for (int i = ; i < ; i++)
{
int x = uf_find(i);
rlt[x].minid = min(rlt[x].minid, i);
rlt[x].ts += node[i].ts;
rlt[x].mj += node[i].mj;
rlt[x].siz++;
}
sort(rlt, rlt + );
int cnt = ;
for (int i = ; i < ; i++)
{
if (rlt[i].mj != )
cnt++;
else
break;
}
printf("%d\n", cnt);
for (int i = ; i < cnt; i++)
{
if (rlt[i].mj != )
printf("%04d %d %.3f %.3f\n", rlt[i].minid, rlt[i].siz,
1.0 * rlt[i].ts / rlt[i].siz, 1.0 * rlt[i].mj / rlt[i].siz);
}
return ;
}

L2-4 最长对称子串

枚举回文中点,向两边扩展枚举。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; char s[]; int main()
{
gets(s);
int len = strlen(s);
int ans = ;
for (int i = ; i < len; i++)
{
int l = i, r = i;
int curans = ;
while (l >= && r < len && s[l] == s[r])
curans += , l--, r++;
ans = max(ans, curans - );
if (i < len - && s[i] == s[i + ])
{
l = i;
r = l + ;
curans = ;
while (l >= && r < len && s[l] == s[r])
curans += , l--, r++;
ans = max(ans, curans);
}
}
printf("%d", ans);
return ;
}

L3-1 肿瘤诊断

三维的图找连通块,道理和二维一样,注意这里只能宽搜。

 #include <cstdio>
#include <queue>
using namespace std; bool pic[][][];
bool vis[][][];
int dx[] = {,-,,,,};
int dy[] = {,,-,,,};
int dz[] = {,,,,,-};
int m, n, l, t; int bfs(int z, int x, int y)
{
queue<int> q;
q.push(z * (m * n) + x * n + y);
vis[z][x][y] = true;
int cnt = ;
while (!q.empty())
{
cnt++;
int cur = q.front();
q.pop();
z = cur / (m * n);
cur %= m * n;
x = cur / n;
y = cur % n;
for (int i = ; i < ; i++)
{
int zz = z + dz[i];
int xx = x + dx[i];
int yy = y + dy[i];
if (zz < || zz >= l)
continue;
if (xx < || xx >= m)
continue;
if (yy < || yy >= n)
continue;
if (pic[zz][xx][yy] && !vis[zz][xx][yy])
{
vis[zz][xx][yy] = true;
q.push(zz * (m * n) + xx * n + yy);
}
}
}
return cnt;
} int main()
{
scanf("%d%d%d%d", &m, &n, &l, &t);
for (int i = ; i < l; i++)
for (int j = ; j < m; j++)
for (int k = ; k < n; k++)
{
int v;
scanf("%d", &v);
pic[i][j][k] = v == ;
}
int ans = ;
for (int i = ; i < l; i++)
for (int j = ; j < m; j++)
for (int k = ; k < n; k++)
{
if (!vis[i][j][k] && pic[i][j][k])
{
int cnt = bfs(i, j, k);
if (cnt >= t)
ans += cnt;
}
}
printf("%d", ans);
return ;
}

L3-2 垃圾箱分布

跑m次spfa就好了,注意结果四舍五入~

 #include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std; const long long inf = 1LL << ;
vector<pair<int, int> > G[];
long long dis[];
bool inqueue[];
int n, m, k;
long long ds;
long long ansdis = -;
double avgdis = 1e30;
int ansid = -; void spfa(int s)
{
fill(dis, dis + , inf);
queue<int> q;
q.push(s);
dis[s] = ;
while (!q.empty())
{
int cur = q.front();
q.pop();
inqueue[cur] = false;
for (int i = ; i < G[cur].size(); i++)
{
if (dis[cur] + G[cur][i].second < dis[G[cur][i].first])
{
dis[G[cur][i].first] = dis[cur] + G[cur][i].second;
if (!inqueue[G[cur][i].first])
{
inqueue[G[cur][i].first] = true;
q.push(G[cur][i].first);
}
}
}
}
long long mindis = *min_element(dis + , dis + n + );
long long maxdis = *max_element(dis + , dis + n + );
if (maxdis > ds)
return;
double sum = 0.0;
for (int i = ; i <= n; i++)
sum += dis[i];
sum /= n;
if (mindis > ansdis)
{
ansdis = mindis;
avgdis = sum;
ansid = s;
}
else if (mindis == ansdis)
{
if (avgdis - sum > 1e-)
{
ansdis = mindis;
avgdis = sum;
ansid = s;
}
}
} int main()
{
scanf("%d%d%d%lld", &n, &m, &k ,&ds);
for (int i = ; i < k; i++)
{
char s1[], s2[];
int a, b, d;
scanf("%s%s%d", s1, s2, &d);
if (s1[] == 'G')
sscanf(s1 + , "%d", &a), a += n;
else
sscanf(s1, "%d", &a);
if (s2[] == 'G')
sscanf(s2 + , "%d", &b), b += n;
else
sscanf(s2, "%d", &b);
G[a].push_back(make_pair(b, d));
G[b].push_back(make_pair(a, d));
}
for (int i = n + ; i <= n + m; i++)
spfa(i);
if (ansid == -)
puts("No Solution");
else
{
avgdis *= 10.0;
avgdis += 0.5;
avgdis = floor(avgdis);
avgdis /= 10.0;
printf("G%d\n%.1lf %.1lf", ansid - n, 1.0 * ansdis, avgdis);
}
return ;
}
  L1-1 N个数求和
  L1-2 比较大小
  L1-3 A-B
  L1-4 计算指数
  L1-5 计算阶乘和
  L1-6 简单题
  L1-7 跟奥巴马一起画方块
  L1-8 查验身份证
  L2-1 集合相似度
  L2-2 树的遍历
  L2-3 家庭房产
  L2-4 最长对称子串
  L3-1 肿瘤诊断
  L3-2 垃圾箱分布

PAT团体程序设计天梯赛 - 模拟赛的更多相关文章

  1. PAT 团体程序设计天梯赛 L1-046 整除光棍(模拟除法)

    L1-046. 整除光棍 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 翁恺 这里所谓的"光棍",并不是指单身汪 ...

  2. PAT 团体程序设计天梯赛-练习集 L1-005. 考试座位号

    每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...

  3. PAT 团体程序设计天梯赛-练习集 L2-009. 抢红包

    没有人没抢过红包吧…… 这里给出N个人之间互相发红包.抢红包的记录,请你统计一下他们抢红包的收获. 输入格式: 输入第一行给出一个正整数N(<= 104),即参与发红包和抢红包的总人数,则这些人 ...

  4. PAT 团体程序设计天梯赛-练习集 L2-003. 月饼

    月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼.现给定所有种类月饼的库存量.总售价.以及市场的最大需求量,请你计算可以获得的最大收益是多少. 注意:销售时允许取出一部分库存.样 ...

  5. PAT 团体程序设计天梯赛-练习集 L1-020. 帅到没朋友

    原题  https://www.patest.cn/contests/gplt/L1-020 当芸芸众生忙着在朋友圈中发照片的时候,总有一些人因为太帅而没有朋友.本题就要求你找出那些帅到没有朋友的人. ...

  6. PAT 团体程序设计天梯赛-练习集 L1-023. 输出GPLT

    给定一个长度不超过10000的.仅由英文字母构成的字符串.请将字符重新调整顺序,按“GPLTGPLT....”这样的顺序输出,并忽略其它字符.当然,四种字符(不区分大小写)的个数不一定是一样多的,若某 ...

  7. PAT 团体程序设计天梯赛-练习集 L1-019. 谁先倒

    给出甲.乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒. 输入格式: 输入第一行先后给出甲.乙两人的酒量(不超过100的非负整数),以空格分隔.下一行给出一个正整数N(<=1 ...

  8. PAT 团体程序设计天梯赛-练习集 L1-018. 大笨钟

    微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉.不过由于笨钟自己作息也不是很规律,所以敲钟并不定时.一般敲钟的点数是根据敲钟时间而定的,如果正好在某个整点敲,那么“当”数就等于那 ...

  9. PAT 团体程序设计天梯赛-练习集 L1-017. 到底有多二

    一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值.如果这个数是负数,则程度增加0.5倍:如果还是个偶数,则再增加1倍.例如数字“-13142223336”是个11位数,其中有3个2,并且 ...

随机推荐

  1. stl_内存基本处理工具

    内存基本处理工具 STL定义5个全局函数.作用于初始化空间上.各自是:用于构造的construct(),用于析构的destroy(),uninitialized_copy(),uninitialize ...

  2. Pascal Hexagrammum Mysticum 的深度探索

        PASCAL . Hexagrammum Mysticum . (六角迷魂图) . 的深度探索 . 英中对比.英文蓝色,译文黑色,译者补充说明用紫红色 (已校完,但尚未定稿,想再整理并补充内容 ...

  3. JAVA BigDecimal 高精度运算

    文章参考一位博友,由于时间太久忘了链接,见谅! public class BigDecimalUtils { private static final int DIV_SCALE = 10;// 除法 ...

  4. JAVA WEB学习笔记(二):Tomcat服务器的安装及配置

    一.Tomcat的下载及安装. 前往Tomcat官网下载安装包或者免安装压缩包.链接http://tomcat.apache.org/ 这里,我选择的是Tomcat8.0,而不是最新的Tomcat9. ...

  5. 下载Google官方/CM Android源码自己主动又一次開始的Shell脚本

    国内因为某种原因,下载CM或Google官方的Android源码总easy中断.总看着机器.一中断就又一次运行repo sync还太麻烦,所以我特意编写了一段shell脚本(download.sh). ...

  6. Hdu3785

    <span style="color:#6600cc;">/* G - 寻找大富翁 Time Limit:1000MS Memory Limit:32768KB 64b ...

  7. Delphi之萝莉调教篇

    本文纯属技术交流.如果各位看官想与小生一起探讨萝莉的问题的话...PM我吧 关于Delphi的萝莉调教技术,很久以前就有大牛做过了...其实技术早掌握了只是觉得太无聊~估计大家也都会于是就没有写~既然 ...

  8. (linux)likely和unlikely函数

      在Linux内核中likely和unlikely函数有两种(只能两者选一)实现方式,它们的实现原理稍有不同,但作用是相同的,下面将结合linux-2.6.38.8版本的内核代码来进行讲解. 1.对 ...

  9. JS中的存储机制

    一.堆和栈的介绍 1.堆和队,是先进先出:栈,是先进后出,就跟水桶差不多: 2.存储速度:堆和队的存储速度较慢,栈的存储速度较快,会自动释放: 二.js中存储的类型 1.堆,一般用于复杂数据类型,存储 ...

  10. react项目中的注意点

    一.ES6 的编译方法 目前主流的浏览器还不支持ES6. 现在一般采用webpack 和 <script type="text/babel">对jsx  语法进行编译, ...