1033 To Fill or Not to Fill (25 分)

题意 :

  • 坐标轴上有n个加油站,给出每个加油站的位置和油价格,给出总路程长度和油箱最大容量,以及每升油平均跑多少路,最开始油箱是空的
  • 如果到不了终点,输出最多能到达多少路程;如果能到达终点,输出最低价格

思路 :

  • 按照坐标给每个加油站排序,记得加上终点
  • 如果第一个加油站不在起始点,return
  • 对于当前的加油站,要找到它 范围内(油箱满) 中第一个比当前便宜的;如果没有,就找范围内相对最便宜的;如果也没有,说明无法到达终点。可以统一为寻找变量k,出来后再分类
  • 记录当前油量

语法 :

  • for (int i = 0; i < n;)
#include <iostream>
#include <algorithm>
using namespace std;const int N = 510;int c_max, d, d_avg, n;
struct Stop
{double p, d;bool operator< (const Stop& t) const{if (d != t.d) return d < t.d;return p < t.p;}
}s[N];int main()
{scanf("%d%d%d%d", &c_max, &d, &d_avg, &n);for (int i = 0; i < n; i ++ ) scanf("%lf%lf", &s[i].p, &s[i].d);s[n] = {0, (double)d};sort(s, s + n + 1);if (s[0].d){puts("The maximum travel distance = 0.00");return 0;}double res = 0, oil = 0;for (int i = 0; i < n;){int k = -1;for (int j = i + 1; j <= n && s[j].d - s[i].d <= c_max * d_avg; j ++ ){if (s[j].p <= s[i].p){k = j;break;}else if (k == -1 || s[k].p > s[j].p)k = j;}if (k == -1){printf("The maximum travel distance = %.2lf\n", s[i].d + (double)c_max * d_avg);return 0;}if (s[k].p <= s[i].p){res += ((s[k].d - s[i].d) / d_avg - oil) * s[i].p;oil = 0;i = k;}else{res += (c_max - oil) * s[i].p;oil = c_max - (s[k].d - s[i].d) / d_avg;i = k;}}printf("%.2lf\n", res);
}

1037 Magic Coupon (25 分)

题意 :

  • 给两个序列,每个序列中每个数只能被使用一次(可以不使用),求每次从两个序列中分别挑出一个数相乘之和最大值

思路 :

  • 双指针,不需要四个容器,只需要两个容器即可
  • for循环是满足条件才会进入到循环内
#include <iostream>
#include <algorithm>
using namespace std;const int N = 1e5 + 10;typedef long long ll;int n, m;
ll a[N], b[N];int main()
{scanf("%d", &n);for (int i = 0; i < n && scanf("%lld", &a[i]); i ++ );scanf("%d", &m);for (int i = 0; i < m && scanf("%lld", &b[i]); i ++ );sort(a, a + n);sort(b, b + m);ll sum = 0;for (int i = 0, j = 0; i < n && j < m && a[i] < 0 && b[j] < 0; i ++ , j ++ ) sum += a[i] * b[j];for (int i = n - 1, j = m - 1; i >= 0 && j >= 0 && a[i] > 0 && b[j] > 0; i -- , j -- ) sum += a[i] * b[j];printf("%lld\n", sum);
}

1067 Sort with Swap(0, i) (25 分)

题意 :

  • 给一个0-(n-1)的序列,每次可以将数字0与其他任意数交换,求最少交换次数使得达到升序效果

思路 :

  • 先转换成图论问题,0的位置在1,所以从0向1连一条边,1的位置在3,所以1向3连一条边,3的位置在4,4的位置在0,2的位置在2自己和自己连一条边,即,如果i在p[i]位置上,就i向p[i]连一条边,这样就可以转化成一个图论问题,且每一个数只会在一个位置上,只会有一个出边,且每个位置上只会有一个数,所以每个点只会有一个入边,即,每个点只会有一个出边和入边,也就是说每个点的出度和入度都是1,这样的图是很特殊的,必然是一堆环,每个点必然在环中;我们的目标就是让0在0位置,1在1位置,即让这堆环变成n个自环;
  • 现在看每个操作的效果,每次交换的数必然和0在同一个环或者不在同一个环,如果在同一个环内部,比如把0和5交换,0在3的位置上,5在7的位置上,那么0就在7的位置上,5就在3的位置上,发现,如果把0和环内的一个点交换,这个环就会破裂成两个环;如果把0和3交换,那么就是3指向0的指针,也就是3自环,0指向5,这样就是变成一个自环和另一个环;
  • 如果把0和另外一个环交换,比如0和8交换,就会形成一个更大的环;即,如果把0和另外一个环内交换,就是把两个环合并;如果0和环内的交换,就会把这个环破开
  • 总结,一共有两种操作,和环内与和环外;显然,环外点必然在某个时刻和0交换;和环内点交换的操作也可以分为两种,一个是与0的下一个点交换,会把下一个点变成自环,第二种是与非下一个点交换,会把环破成两个环,会发现这样的话,如果想变成自环,早晚还是要合并回来,所以可以发现,环内的第二种操作必然是不做的;即,对于环内的点,必然只与0的下一个点交换



  • 输入时,记录每个值的位置,直到每个点都自环前,将0所在环所有点都自环,直到p[0]==0也就是0也自环,这个环就全部自环了,找到第一个没有自环的点,如果能找到,将0与这个点交换,合并环
  • 时间复杂度O(N)O(N)O(N)
#include <iostream>
using namespace std;const int N = 1e5 + 10;int p[N];int main()
{int n; scanf("%d", &n);int id;for (int i = 0; i < n; i ++ ){scanf("%d", &id);p[id] = i;}int res = 0;for (int i = 0; i < n; ){while (p[0]) swap(p[0], p[p[0]]), res ++ ;while (i < n && p[i] == i) i ++ ;if (i < n) swap(p[0], p[i]), res ++ ;}printf("%d", res);
}

1125 Chain the Ropes (25 分)

题意 :

  • 每次串连后,原来两段绳子的长度就会减半。
  • 给定 N 段绳子的长度,你需要找出它们能串成的绳子的最大长度。

思路 :

  • 贪心从小到大选即可

语法 :

  • 由于每次都是现有的一段加上一个新的一段除以2,所以每次改变a[0]即可
#include <iostream>
#include <algorithm>
using namespace std;const int N = 1e4 + 10;double a[N];int main()
{int n; scanf("%d", &n);for (int i = 0; i < n && scanf("%lf", &a[i]); i ++ );sort(a, a + n);for (int i = 1; i < n; i ++ ) a[0] = (a[0] + a[i]) / 2;printf("%d", (int)a[0]);
}

PAT甲级题目翻译+答案 AcWing(贪心)相关推荐

  1. PAT甲级题目翻译+答案 AcWing(数学)

    1059 Prime Factors (25 分) 题意 : 给一正整数,要求分解质因数 思路 : 使用is_first,来完成除了第一个质因数前都有*的效果 如果n=1,要特判 最后如果n>1 ...

  2. PAT甲级题目翻译+答案 AcWing(排序)

    1012 The Best Rank (25 分) 题意 :给ID和3门成绩,计算其平均分A,输出每位学生最好的排名,A>C>M>E 思路 :如果将所需的若干个元素中使第一个元素为后 ...

  3. PAT甲级题目翻译+答案 AcWing(模拟)

    1008 Elevator (20 分) 思路 :last可能等于cur,而无论是否相等,res都是+5的 #include <iostream>using namespace std;i ...

  4. PAT甲级题目翻译+答案 AcWing(动态规划)

    1007 Maximum Subsequence Sum (25 分) 题意 :注意最后输出的不是索引而是在那个索引的数 思路 :f为当前的假设开始指针,每一次累加到sum,如果sum大于res,就更 ...

  5. PAT甲级题目翻译+答案 AcWing(图论)

    1003 Emergency (25 分) 题意 :求无向图中最短路的数量,以及在最短路情况下,点权之和最大是多少 思路 :dijkstra的扩展一般在第三步"用t更新其它点":s ...

  6. PAT甲级题目翻译+答案 AcWing(进位制)

    1010 Radix (25 分) 题意 :radix进制 题意 :给两个数和其中一个数的进制,问另一个数能否在某一进制下与这数相等 思路 :如果tag等于2就交换,最后还是只需要处理tag为1这种情 ...

  7. PAT甲级题目翻译+答案 AcWing(字符串处理)

    1001 A+B Format (20 分) 题意 :将整数转换成标准格式 思路 :从后往前遍历字符串进行模拟,每三个数字加一个逗号,但不能是在最前面加逗号,也不能是加在负号后面 #include & ...

  8. PAT甲级题目翻译+答案 AcWing(链表)

    1032 Sharing (25 分) 题意 : suffix后缀:prefix前缀 每个结点存一个字母,一共存两个单词 分别给两个单词的第一个字母的地址以及总共的结点数 给出所有结点的地址数值和下一 ...

  9. PAT甲级题目翻译+答案 AcWing(树)

    1004 Counting Leaves (30 分) 题意 : 家庭关系可以用家谱树来表示,给定一个家谱树,你的任务是找出其中没有孩子的成员. 第一行包含一个整数 N 表示树中结点总数以及一个整数 ...

最新文章

  1. 11.如何在非固定大小的地图图片上正确渲染ROS小车的位置和运行轨迹
  2. 创建一个Table View
  3. 用Python进行数据探索,探索竞赛优胜方案
  4. 转:elasticsearch nested嵌套查询
  5. Linux下修改SSH登录端口
  6. 毕业多年没稳定的收入...大龄转行做自动化测试,现在已经快年薪30W
  7. java中REST_Java——Restful风格
  8. mysql实现停车场管理系统完整代码实现_基于微信小程序的停车场管理系统毕业论文+开题报告+前后台(Java+Mysql)源码及数据库文件...
  9. Atitit 文档全文索引的索引种类 用于文本数据挖掘 搜索 数据分析 目录 1.1. Txt摘要索引。。 1 1.2. File placeholder 索引 1 1.3. Lucence索引 1
  10. 从零开始学sai,5天精通板绘基础
  11. TMS320C6455之DDR2内存控制器
  12. sketchup(草图大师)-倒圆角-避免破面现象
  13. 毕业设计的开题报告怎么写?
  14. java B2B2C Springcloud电子商城系统- Gateway初体验
  15. Python识别图形验证码
  16. Set 直接转成 数组
  17. Google glog
  18. 计算云服务——弹性伸缩服务
  19. CSS 选择器及常用属性介绍
  20. 与2,3,5无关的数

热门文章

  1. 如何建立应付暂估明细查询
  2. SAP创建Web Service以及用ABAP调用
  3. VF01-billing拆分逻辑详解
  4. SAP 财务模块 FI-TV 差旅管理
  5. 百度健康打通医药电商服务
  6. 拓荒会员电商“无人区”,考拉海购能否拿下“新船票”?
  7. python no module name_python导包显示No module named XXX问题
  8. mysql删除数据表show_数据库与表显示、创建、删除
  9. java 图片合成pdf_java将多张图片合并转为PDF
  10. python查询数据库带逗号_浅谈pymysql查询语句中带有in时传递参数的问题