博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BestCoder27 1002.Taking Bus(hdu 5163) 解题报告
阅读量:5292 次
发布时间:2019-06-14

本文共 3697 字,大约阅读时间需要 12 分钟。

题目链接:

题目意思:有 n 个车站,给出相邻两个车站的距离,即车站 i 和车站 i+1 的距离为 di (1i <n)。然后是 m 个人从他的出发点到他想去的终点(都是车站),约定轮到处理第 i 个人的时候,车站的出发点满足:((i-1) mod n) + 1 ,假设车每走一个单位的距离花费一个单位的时间,车开始的时候是从左到右开的。如果车走到最右的车站即车站 n 会调头,此时方向为从右到左开;如果车走到最左即车站 1,方向转为从左到右开。求出每个人从他出发点到终点需要的最少时间是多少。注意,这个人的出发点不一定和车的出发点相同,此时他要候车,候车时间也计算在内。

      赛中过于浮躁,来不及写完......

  赛后各种 wa,各种wa.......

      思路是对的,就是分六种情况,通过画图,写出公式

    1. sx<y,      2. x<s<y,     3. x<ys,      4. sy<x,      5. y<s<x,       6. y<xs

     

      通过公式的化简,发现有些情况是可以合并的。当 x < y,只要分成两种情况即可(st 即 s ): s <= x(ans = sum[y]-sum[st];) 和 x < s < y, s > y(ans = 2*sum[n] + sum[y] - sum[st];);  当 x > y,公式只有一条(前提是先交换 x , y 的值,保证x, y的大小,方便sum[]的处理):ans = 2*sum[n] - sum[x] - sum[st];

     (sum[y]: 从第一个站到第 y 个站的距离,这个是求解时的优化,如果一个一个距离加,会TLE!还有就是由于求解的时候数据可能很大,要用 long long )

     

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 typedef __int64 ll; 8 const int maxn = 1e5 + 5; 9 ll d, sum[maxn];10 11 int main()12 {13 int n, m, t;14 while (scanf("%d", &t) != EOF) {15 while (t--) {16 scanf("%d%d", &n, &m);17 memset(sum, 0, sizeof(sum));18 for (int i = 1; i < n; i++) {19 scanf("%lld", &d);20 sum[i+1] = d + sum[i];21 }22 int x, y;23 for (int i = 1; i <= m; i++) {24 scanf("%d%d", &x, &y);25 int st = (i-1)%n + 1;26 ll ans = 0;27 if (x < y) { // 左--> 右28 if (st <= x) // s<=x
左34 else { // x

 

 

      原始版(比较详细而且很长,未合并公式前),原来没有覆盖所有情况呀,不过已经改好了, 痛苦改 bug 路 。呜呜呜呜呜呜~~~~! __ !

   

1 #include 
2 #include
3 #include
4 #include
5 using namespace std; 6 7 typedef __int64 ll; 8 const int maxn = 1e5 + 5; 9 ll d, sum[maxn];10 11 int main()12 {13 #ifndef ONLINE_JUDGE14 freopen("in.txt", "r", stdin);15 #endif // ONLINE_JUDGE16 int n, m, t;17 while (scanf("%d", &t) != EOF) {18 while (t--) {19 scanf("%d%d", &n, &m);20 memset(sum, 0, sizeof(sum));21 for (int i = 1; i < n; i++) {22 scanf("%I64d", &d);23 sum[i+1] = d + sum[i];24 }25 int st, end;26 for (int i = 1; i <= m; i++) {27 scanf("%d%d", &st, &end);28 int beg = (i-1)%n + 1;29 30 ll ans = 0;31 if (st < end) {32 if (beg <= st) // s <= x < y33 ans = sum[end]-sum[beg];34 else if (beg > st && beg < end) // x < s < y35 ans = 2*(sum[n]-sum[end]) + (sum[end]-sum[beg]) + 2*sum[end];36 else if (beg >= end) // x < y < s37 ans = 2*(sum[n]-sum[beg]) + (sum[beg]-sum[end]) + 2*sum[end];38 }39 else if (st > end) {40 swap(st, end);41 if (beg <= st) { // s <= y < x42 ans = 2*(sum[n]-sum[st]) + sum[st]-sum[beg];43 }44 else if (beg > st && beg < end) { // y < s < x45 ans = 2*(sum[n]-sum[beg]) + sum[beg]-sum[st];46 }47 else if (beg >= end) { // y < x <= s48 ans = 2*(sum[n]-sum[beg]) + sum[beg]-sum[st];49 }50 }51 printf("%I64d\n", ans);52 }53 }54 }55 return 0;56 }
View Code

 

 

 

    

转载于:https://www.cnblogs.com/windysai/p/4248055.html

你可能感兴趣的文章
通过httplib2 探索的学习的最佳方式
查看>>
理解运算符重载 4
查看>>
快来熟练使用 Mac 编程
查看>>
第二周
查看>>
断言简介
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
plsql使用,为什么可以能看见其他用户的表
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
Scripting Java #3:Groovy与invokedynamic
查看>>
2014-04-21-阿里巴巴暑期实习-后台研发-二面经验
查看>>
数据结构中线性表的基本操作-合并两个线性表-依照元素升序排列
查看>>
使用pager进行分页
查看>>
吐医疗器械研发可配置性需求的槽点
查看>>
UVA - 1592 Database
查看>>
机器翻译评价指标 — BLEU算法
查看>>
机器学习基石(9)--Linear Regression
查看>>
Min Stack
查看>>
从LazyPhp说起
查看>>
Fine Uploader文件上传组件
查看>>
Spring Boot与Spring的区别
查看>>