我们在生命的路上常常绝望 大概是因为弯路走了太多

脚上的泡被磨起又磨破

像我们所有的幻想与梦 起起落落。


所以说 我这道题考场上面和题解想得一模一样啊啊啊啊啊啊啊啊啊啊!!!!!!

但是就是打复杂了啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!!!!!!

为什么我每次一看到环就感觉自己被耍了啊啊啊啊啊啊!!!!!!

自己的写法大概是有一个head tail记录环的首尾这样比较的时候就可以方便跳 然后我还加了一个-1的处理保证被合并了的不再被处理

考场上改了蛮久不过最后还是爆零啦

标程给出的方法是用了一个l数组和一个r数组

这个数被合并了就把它的r赋给左边的r

就相当于通过lr的操作把它挤掉

好无奈啊这么简单又机智的办法我居然没想到

因为lr数组那边处理起来还是有点问题所以标解是手打快排了的

这是标解

 #include<iostream>
 #include<cstdio>
 #include<cstring>
 #include<cstdlib>
 #include<cmath>
 #include<ctime>
 #include<queue>
 #define inf 2147483647
 #define fre(z) freopen(z".in","r",stdin),freopen(z".out","w",stdout)
 #define my long long
 #define d "%lld"
 using namespace std;
 ;
 my getint();
 my n;
 my a[N+];
 my w[N+];
 my l[N+],r[N+];
 my ans;
 void qsort(my,my);
 ////////////在一个环中每次选择两个相邻元素,分数加上两个元素之差,然后把小的元素移除,问分数之和的最小值是多少
 ////////////贪心
 //证明:
 //对于当前环中最小值k以及k的相邻两个元素k_l,k_r
 //把他与相邻数操作后一定是自己移除
 //然后每次合并后留下的是最大值
 //所以如果先合并k_l及k_l左边的元素或k_r及k_r右边的元素,那么合并后k相邻两个元素的值>=k_l,k_r
 //所以首先合并k_l或k_r肯定更优
 //然后肯定要合并min(k_l,k_r)
 //然后直接删除k即可
 int main()
 {
     fre("game");
     n=getint();
     ;i<=n;i++) w[i]=i,a[i]=getint(),l[i]=i-,r[i]=i+;
     l[]=n;r[n]=;
     qsort(,n);
     ;T<n;T++) {
         my i=w[T];
         cout<<i<<" "<<l[i]<<" "<<r[i]<<" "<<a[i]<<endl;
         ans+=min(a[l[i]],a[r[i]])-a[i];
         l[r[i]]=l[i];r[l[i]]=r[i];
     }
     printf(d,ans);
       ;
 }
 my getint()
 {
       my w=;
     ;
     char c=getchar();
     ') && c!='-') c=getchar();
     ,c=getchar();
       +c-',c=getchar();
     return q? -w:w;
 }
 void qsort(my l,my r)
 {
     my i=l,j=r,mid=a[w[(i+j)>>]];
     while (i<=j) {
         while (a[w[i]]<mid) i++;
         while (a[w[j]]>mid) j--;
         if (i<=j) {
             w[]=w[i];
             w[i]=w[j];
             w[j]=w[];
             i++;
             j--;
         }
     }
     if (i<r) qsort(i,r);
     if (l<j) qsort(l,j);
 }

然而作为一个彻头彻尾sort党很不服气

于是强行一波

 #include<iostream>
 #include<cstdio>
 #include<cstdlib>
 #include<algorithm>
 #include<cstring>
 #define N 100030
 #define ll long long
 using namespace std;
 struct hh
 {
     ll v,id,l,r;
 }a[N];
 ll ans=,n;
 ll b[N];
 bool cmp(hh x,hh y){return x.v<y.v;}
 int main(){
     freopen ("game.in","r",stdin);
     freopen ("game.out","w",stdout);
     scanf ("%lld",&n);
     ;i<=n;++i){
         scanf ("%lld",&a[i].v);
         a[i].id=i,a[i].l=i-,a[i].r=i+;
     }
     a[].l=n,a[n].r=;
     sort(a+,a+n+,cmp);
     ;i<=n;++i) b[a[i].id]=i;
     ;i<n;++i){
         ans+=min(a[b[a[i].l]].v,a[b[a[i].r]].v)-a[i].v;
         a[b[a[i].r]].l=a[i].l,a[b[a[i].l]].r=a[i].r;
     }
     cout<<ans;
     ;
 }

那么这个悲惨的故事告诉我们处理问题的时候尽量简化

因为想多了要处理的细节多了反而瞬间爆炸

还不如把事情最简化一下

GAME——转圈游戏的更多相关文章

  1. [快速幂][NOIP2012]转圈游戏

    转圈游戏 题目描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 1 号位置, ...

  2. 3285 转圈游戏 2013年NOIP全国联赛提高组

    3285 转圈游戏 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond       题目描述 Description n 个小伙伴 ...

  3. codevs3285转圈游戏

    传送门 3285 转圈游戏 2013年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Descript ...

  4. 洛谷 P1965 转圈游戏

    洛谷 P1965 转圈游戏 传送门 思路 每一轮第 0 号位置上的小伙伴顺时针走到第 m 号位置,第 1 号位置小伙伴走到第 m+1 号位置,--,依此类推,第n − m号位置上的小伙伴走到第 0 号 ...

  5. 1617:转圈游戏 ybt

    1617:转圈游戏 时间限制: 1000 ms         内存限制: 524288 KB提交数: 540     通过数: 326 [题目描述] nn 个小伙伴(编号从 00 到 n−1n−1 ...

  6. 题解 【NOIP2013】转圈游戏

    [NOIP2013]转圈游戏 Description n个小伙伴(编号从0到n-1)围坐一圈玩游戏.按照顺时针方向给n个位置编号,从0到n-1.最初,第0号小伙伴在第0号位置,第1号小伙伴在第1号位置 ...

  7. luoguP1965 转圈游戏(NOIP2013)(快速幂)

    luogu P1965 转圈游戏 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include ...

  8. 洛谷P1965 转圈游戏 [2013NOIP提高组 D1T1][2017年6月计划 数论04]

    P1965 转圈游戏 题目描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在第 ...

  9. 快速幂——while理解&&[P1965] 转圈游戏

    快速幂--while理解 \[a^k\] 把k转成2进制 \[k=2^n*p[n]+2^(n-1)*p[n-1]+...+2^1*p[1]+2^0*p[0]\] \[a^k=a^(2^n*p[n]+2 ...

  10. Java实现 蓝桥杯 算法提高 转圈游戏(暴力快速幂)

    试题 算法提高 转圈游戏 问题描述 n 个小伙伴(编号从 0 到 n-1)围坐一圈玩游戏.按照顺时针方向给 n 个位置编号,从0 到 n-1.最初,第 0 号小伙伴在第 0 号位置,第 1 号小伙伴在 ...

随机推荐

  1. 常用接口简析2---IComparable和IComparer接口的简析

    常用接口的解析(链接) 1.IEnumerable深入解析 2.IEnumerable.IEnumerator接口解析 3.IList.IList接口解析 默认情况下,对象的Equals(object ...

  2. A workaround to change shared memory size for Docker containers in AWS ECS

    Issue Because of not supporting to specify the following docker run parameter, containers in ECS can ...

  3. 【Win 10 应用开发】在后台播放视频

    从 1607 (14393)版本开始,MediaPlayer 类就可以在前台与后台之间无缝播放,你不必再考虑前台与后之间的通信,所以从 14393 开始,你就不需要再用 BackgroundMedia ...

  4. lazy ideas in programming(编程中的惰性思想)

    lazy形容词,懒惰的,毫无疑问是一个贬义词.但是,对于计算机领域,lazy却是非常重要的优化思想:把任务推迟到必须的时刻,好处是避免重复计算,甚至不计算.本文的目的是抛砖引玉,总结一些编程中的laz ...

  5. python3.5安装pyHook,解决【TypeError: MouseSwitch() missing 8 required positional arguments: 'msg', 'x', 'y', 'data', 'time', 'hwnd', and 'window_name'】这个错误!

    为什么安装 pyHook包:为Windows中的全局鼠标和键盘事件提供回调. Python应用程序为用户输入事件注册事件处理程序,例如鼠标左键,鼠标左键,键盘键等 先要实时获取系统的鼠标位置或者键盘输 ...

  6. C#开发Windows窗体应用程序的步骤

    使用C#开发应用程序时,一般包括创建项目.界面设计.设置属性.编写程序代码.保存项目.程序运行等6个步骤. 1.创建项目 在Visual Studio2017开发环境中选择“文件”→“新建”→“项目” ...

  7. 条件注释判断IE版本

    在学习Bootstra的时候看到这么一句话, <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media ...

  8. FFmpeg之AVPacket

    花满楼原创 AVPacket,是压缩数据的结构体(解码前或编码后的结构体). 本文介绍FFmepg中常见结构AVPacekt,尽量用具体值来理解. 整个用于调试的代码可以这样写: #include & ...

  9. JAVA技术图谱

  10. 关于[LeetCode]Factorial Trailing Zeroes O(logn)解法的理解

    题目描述: Given an integer n, return the number of trailing zeroes in n!. 题目大意: 给定一个整数n,返回n!(n的阶乘)结果中后缀0 ...