PAT 2018 秋

A 1148 Werewolf - Simple Version

  思路比较直接:模拟就行。因为需要序列号最小的两个狼人,所以以狼人为因变量进行模拟。

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6
 7 using namespace std;
 8 int N;
 9 vector<int> stateVec;
10 vector<int> inputVec;
11 bool judgeRight(int a, int b)
12 {
13     int liarCnt = 0, wereLiarCnt = 0, tmpNum;
14     fill(stateVec.begin(), stateVec.end(), 0);
15     stateVec[a] = stateVec[b] = 1;
16     for(int i = 1; i <= N; ++ i)
17     {
18         tmpNum = inputVec[i];
19         if((tmpNum > 0 && stateVec[tmpNum] == 1) || (tmpNum < 0 && stateVec[-tmpNum] == 0))
20         {
21             liarCnt ++;
22             if(i == a || i == b)
23                 wereLiarCnt ++;
24         }
25     }
26     if(liarCnt == 2 && wereLiarCnt == 1)
27         return true;
28     else
29         return false;
30 }
31 int main()
32 {
33     cin >> N;
34     inputVec.resize(N+1, 0);
35     stateVec.resize(N+1, 0);
36     for(int i = 1; i <= N; ++ i)
37         cin >> inputVec[i];
38     for(int i = 1; i < N; ++i)
39     {
40         for(int j = i+1; j <= N; ++ j)
41         {
42             if(judgeRight(i,j))
43             {
44                 cout << i << " " << j;
45                 return 0;
46             }
47         }
48     }
49     cout << "No Solution";
50     return 0;
51 }

A 1149 Dangerous Goods Packaging

  这个最开始使用图+二重for循环直接判,发现超时很严重。后来改用邻接表存储,每个物品更新一下与其互斥物品的标志。成功通过。

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <unordered_map>
 7 using namespace std;
 8 int N, M;
 9 typedef long long LL;
10 unordered_map<int, vector<int>> goodsMap;
11 vector<int> goodsVec;
12 bool judgeRight(void)
13 {
14     int tmpNum;
15     int len = goodsVec.size();
16     unordered_map<int, int> incomFlagMap;
17     for(int i = 0; i < len; ++ i)
18     {
19         tmpNum = goodsVec[i];
20         if(incomFlagMap[tmpNum] == 1)
21             return false;
22         for(auto it = goodsMap[tmpNum].begin(); it != goodsMap[tmpNum].end(); ++it)
23             incomFlagMap[*it] = 1;
24     }
25     return true;
26 }
27 int main()
28 {
29     cin >> N >> M;
30     int tmpNum2, tmpNum1;
31     while(N--)
32     {
33         cin >> tmpNum1 >> tmpNum2;
34         goodsMap[tmpNum1].push_back(tmpNum2);
35         goodsMap[tmpNum2].push_back(tmpNum1);
36     }
37     while(M--)
38     {
39         cin >> N;
40         goodsVec.resize(N,0);
41         while(N--)
42             cin >> goodsVec[N];
43         if(judgeRight())
44             cout << "Yes" << endl;
45         else
46             cout << "No" << endl;
47     }
48     return 0;
49 }

A 1150 Travelling Salesman Problem

  这个理解题意就行。需要注意的地方:

              1.不能通过的路径,距离输出为NA

              2.最小距离是在TS cycle 和 TS simple cycle中选出

              3.TS cycle 需要最后一个城市为出发城市

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 using namespace std;
 7 int N, M, K;
 8 const int INF = 0x7f7f7f7f;
 9 int route[210][210]={0};
10 int main()
11 {
12     cin >> N >> M;
13     int tmpSt, tmpEnd, tmpDis, tmpNum, lastCity, nowCity, minDis = INF, minIndex;
14     while(M--)
15     {
16         cin >> tmpSt >> tmpEnd >> tmpDis;
17         route[tmpSt][tmpEnd] = tmpDis;
18         route[tmpEnd][tmpSt] = tmpDis;
19     }
20     cin >> K;
21     for(int i = 1; i <= K; ++i)
22     {
23         tmpDis = 0;
24         cin >> tmpNum;
25         cin >> tmpSt;
26         lastCity = tmpSt;
27         vector<int> flagVec(N+1,0);
28         bool simpleFlag = true;
29         int travelCityCnt = 0;
30         for(int j = 1; j < tmpNum; j++)
31         {
32             cin >> nowCity;
33             if(flagVec[nowCity] == 0)
34             {
35                 flagVec[nowCity] = 1;
36                 travelCityCnt ++;
37             }
38             else
39                 simpleFlag = false;
40             if(tmpDis >= 0 && route[lastCity][nowCity] > 0)
41                 tmpDis += route[lastCity][nowCity];
42             else
43                 tmpDis = -1;
44             lastCity = nowCity;
45         }
46         if(lastCity == tmpSt && simpleFlag && tmpDis >= 0 && travelCityCnt == N)
47             printf("Path %d: %d (TS simple cycle)\n", i, tmpDis);
48         else if(tmpDis >= 0 && lastCity == tmpSt && travelCityCnt >= N)
49             printf("Path %d: %d (TS cycle)\n", i, tmpDis);
50         else
51         {
52             tmpDis >= 0 ? printf("Path %d: %d (Not a TS cycle)\n", i, tmpDis) : printf("Path %d: NA (Not a TS cycle)\n", i);
53             tmpDis = -1;
54         }
55         if(tmpDis > 0 && tmpDis < minDis)
56         {
57             minDis = tmpDis;
58             minIndex = i;
59         }
60     }
61     printf("Shortest Dist(%d) = %d", minIndex, minDis);
62     return 0;
63 }

A 1151 LCA in a Binary Tree

  只得到了22分,剩下的8分找不到原因了。╮(╯▽╰)╭

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <unordered_map>
 7 using namespace std;
 8 int N, M, K;
 9 vector<int> preOrderVec, inOrderVec;
10 unordered_map<int, int> valToIndexMap;
11 unordered_map<int, int> indexToValMap;
12 void insertVal(int inL, int inR, int preL, int preR, int index)
13 {
14     if(inL > inR || preL > preR)
15         return;
16     int tmpNum = preOrderVec[preL];
17     int tmpIndex = inL;
18     while(inOrderVec[tmpIndex] != tmpNum)
19         tmpIndex++;
20     //treeNodeVec[index] = tmpNum;
21     valToIndexMap[tmpNum] = index;
22     indexToValMap[index] = tmpNum;
23     insertVal(inL, tmpIndex-1, preL+1, preL+tmpIndex-inL, index*2);
24     insertVal(tmpIndex+1, inR, preR-inR+tmpIndex+1,preR, index*2+1);
25     return;
26 }
27 void getNodeInfo(int a, int b)
28 {
29     int tmpIndex1 = valToIndexMap[a], tmpIndex2 = valToIndexMap[b];
30     if(tmpIndex1 == 0 && tmpIndex2 == 0)
31         printf("ERROR: %d and %d are not found.\n", a, b);
32     else if(tmpIndex1 == 0 || tmpIndex2 == 0)
33         tmpIndex1 == 0 ? printf("ERROR: %d is not found.\n", a) : printf("ERROR: %d is not found.\n", b);
34     else
35     {
36         while(tmpIndex1 != tmpIndex2)
37             tmpIndex1 > tmpIndex2 ? tmpIndex1 /= 2 : tmpIndex2 /= 2;
38         int tmpNum = indexToValMap[tmpIndex1];
39         if(tmpNum == a || tmpNum == b)
40             tmpNum == a ? printf("%d is an ancestor of %d.\n", a, b) : printf("%d is an ancestor of %d.\n", b, a);
41         else
42             printf("LCA of %d and %d is %d.\n", a, b, tmpNum);
43     }
44 }
45 int main()
46 {
47     cin >> M >> N;
48     int tmpNum1, tmpNum2;
49     preOrderVec.resize(N);
50     inOrderVec.resize(N);
51     for(int i = 0; i < N; ++i)
52         cin >> inOrderVec[i];
53     for(int i = 0; i < N; ++ i)
54         cin >> preOrderVec[i];
55     insertVal(0, N-1, 0, N-1, 1);
56     while(M--)
57     {
58         cin >> tmpNum1 >> tmpNum2;
59         getNodeInfo(tmpNum1, tmpNum2);
60     }
61     return 0;
62 }

原文地址:https://www.cnblogs.com/codewars/p/11374301.html

时间: 2024-10-07 16:07:09

PAT 2018 秋的相关文章

京东2018秋招c++岗 神奇数

题意大概是: 一个数比如242,把所有数字分成两组,而且两组的和相等,那么这个数就是神奇数,此时242,能够分成{2,2}和{4},所以242是神奇数. 题目要求输入n和m求[n,m]区间内神奇数的个数. 思路: 对于任意一个数字,将每一位上的数字保存到数组里,并求所有位上的数字的和sum.然后使用回溯法遍历数组, 查看数组内是否存在和为sum/2的情况,如果存在则为神奇数. bool isfind(vector<int>& nums, int sum, int cur, int be

2018秋招面试题

https://blog.csdn.net/bntX2jSQfEHy7/article/details/81187626 各大企业面试题: https://blog.csdn.net/huangshulang1234/article/details/79102943 一.阿里巴巴面试 第一个:阿里面试都问什么? :(55分钟) 01 1.开发中Java用了比较多的数据结构有哪些?2.谈谈你对HashMap的理解,底层原理的基本实现,HashMap怎么解决碰撞问题的?这些数据结构中是线程安全的吗?

2018秋招小红书算法方向在线编程题

代码如下: class TreeNode: def __init__(self, x): self.left=None self.right=None self.value=x def BuildTree(ceng, zhong): if len(ceng)==0: return None if len(ceng)==1: return TreeNode(ceng[0]) else: flag=TreeNode(ceng[0]) root=ceng[0] zong=zhong[:zhong.in

2018秋招数据库笔试面试题汇总

基础概念 1. 什么是数据库事务?事务有什么特点? 数据库事务:是指作为单个逻辑工作单元执行的一系列操作,这些操作要么全做,要么全不做,是一个不可分割的工作单元. 事务特点: 原子性 一致性 隔离性 持久性特 2. 主键和外键的区别? 主键所在的列的值是唯一的,不可为空的 外键所在的列的值可以重复,可以为空的,不能创建对应表中不存在的外键值 3. truncate与delete的区别? 比较 truncate delete 相同点 删除表中的全部行 不带where字句删除表中的全部行 相同点 删

腾讯 2018 秋招精选(50 题)

AC # 题名 难度   2 两数相加  中等   4 两个排序数组的中位数  困难   5 最长回文子串  中等   7 反转整数  简单   8 字符串转整数  中等   9 回文数   简单   11 盛最多水的容器  中等   14 最长公共前缀  简单   15 三数之和   中等   16 最接近的三数之和  中等   20 有效的括号  简单   21 合并两个有序链表  简单   23 合并k个有链表  困难   26 删除排序数组中的重复项   简单   33 搜索旋转排序数组

2018秋招校招后端方向(第二批)

用户喜好 为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k.因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1). 输入描述: 输入: 第1行为n代表用户的个数 第2行为n个整数,第i个代表用户标号为i的用户对某类文章的喜好度 第3行

PAT 2014 秋

A 1084 Broken Keyboard 注意大小写即可. 1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <string> 5 6 using namespace std; 7 8 int main() 9 { 10 string inStr, outStr; 11 cin >> inStr >> outStr; 12 int

前端基础之网络

必会: http报文都有哪些内容? HTTP协议头含有哪些重要的部分,HTTP状态码? HTTP状态码状态码都有哪些? 什么是强缓存?什么是弱缓存? 浏览器的现缓存机制是什么?如何设置HTTP缓存? 你知道有哪些HTTP方法?POST 和 PUT 有什么区别? 如何对数据进行压缩(ZLIB),Gzip? 压缩的范围是什么,请求头会压缩吗? 跨域,为什么JS会对跨域做出限制?如何允许跨域? 基础: 影响网速的原因有哪些?网络丢包的主要原因是什么? 网络体系结构的五层参考模型都是什么?它们之间的关系

前端计算机网络基础

整理这篇文章需要30分钟: 一站到底 ---前端基础之网络 网络相关的知识是每个前端工程师都应该具备的.很多从事前端的朋友们都没系统学习过计算机网络和http相关内容.在没有建立一个整体的知识体系下,会有一种一站到底答题的感觉,每个知识点都大致知道问题的答案,但总不确定,更不知道具体是怎么回事.本文系统的梳理了与前端密切相关的网络知识.(这是我自己学习的总结,整理出的笔记,分享给大家) 还是老规则,在学之前,我们先考考自己,我整理一下知识点,看看我们需要掌握那些问题.然后我们通过把问题知识点串起