首页 > 其他分享 >D - Takahashi's Solitaire -- ATCODER

D - Takahashi's Solitaire -- ATCODER

时间:2022-11-13 23:56:08浏览次数:73  
标签:ATCODER index -- long ii int Solitaire csum maxsum

D - Takahashi's Solitaire

https://atcoder.jp/contests/abc277/tasks/abc277_d

 

思路

先计算所有的输入的和 total,

将输入列表首先进行排列

找到所有连续段和中最大的值 maxsum, 此处连续满足条件 a[i] == a[i+1] 或者 a[i] + 1 == a[i+1]

最后 total - maxsum 即期望值。

 

 

Code

https://atcoder.jp/contests/abc277/submissions/36454757

long long n, m;
vector<long long> a;
 
int main()
{
    cin >> n >> m;
    
    long long totalsum = 0;
    
    for(int i=0; i<n; i++){
        int temp;
        cin >> temp;
        a.push_back(temp);
        
        totalsum += temp;
    }
 
    sort(a.begin(), a.end());
    
    int continous = true;
    
    for(int i=0; i<n-1; i++){
        if (a[i] == a[i+1]
        || a[i] + 1 == a[i+1]){
            continue;
        } else {
            continous = false;
            break;
        }
    }
    
    if (continous == true){
        cout << 0 << endl;
        return 0;
    }
 
    long long maxsum = -1;
 
    int size = a.size();
    int last_index = size - 1;
    int first_index = 0;
 
    // treat first_index position
    long long zsum = 0;
    int zv = a[0];
    zsum += zv;
    first_index++;
    
    int ii = first_index;
    while(a[ii] == a[ii - 1]
    || a[ii] == a[ii - 1] + 1){
        zsum += a[ii];
        ii++;
        first_index++;
    }
    
    if (zv == 0){
        int lv = a[last_index];
        if ((lv + 1) % m == 0){
            zsum += lv;
            last_index--;
            
            int ii = last_index;
            while(a[ii] == a[ii+1]
            || a[ii] + 1 == a[ii+1]){
                zsum += a[ii];
                ii--;
                last_index--;
            }
        }
    }
    
    if (maxsum < zsum){
        maxsum = zsum;
    }
 
    while(first_index <= last_index){
        // search continium towards
        long long csum = 0;
        int cv = a[first_index];
        csum += cv;
        first_index++;
 
        if (first_index > last_index){
            if (maxsum < csum){
                maxsum = csum;
            }
 
            break;
        }
 
        int ii = first_index;
        while(a[ii] == a[ii - 1]
        || a[ii] == a[ii - 1] + 1){
            csum += a[ii];
            first_index++;
            ii++;
        }
        
        if (maxsum < csum){
            maxsum = csum;
        }
    }
 
    cout << totalsum - maxsum << endl;
 
    return 0;
}
 

 

标签:ATCODER,index,--,long,ii,int,Solitaire,csum,maxsum
From: https://www.cnblogs.com/lightsong/p/16887743.html

相关文章

  • 二、ava基础语法
    1、标识符的命名规则有哪些?(1)由26个英文字母的大小写、数字、下划线和$符号组成。(2)数字不能作为开头。(3)不能使用Java的关键字和保留字。(4)区分大小写,长度无限制。(5)标识......
  • Java语法概述
    1.JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些JDK=JRE+Java的开发工具(javac.exe、java.exe、javadoc.exe)JRE=JVM+Java核心类库2.为什么要配......
  • TensorFlow和pytorch中的pin_memory和non_blocking设置是做什么的,又是否有用???(续2)
    接前文:TensorFlow和pytorch中的pin_memory和non_blocking设置是做什么的,又是否有用???TensorFlow和pytorch中的pin_memory和non_blocking设置是做什么的,又是否有用???(续)  ......
  • 代码随想录算法训练营第十五天| 二叉树的层序遍历
    二叉树的层序遍历:https://leetcode.cn/problems/binary-tree-level-order-traversal/层序遍历使用队列实现:用size记录当前层的个数,size--控制弹出元素的个数,保证当前层的......
  • LinkdBlockingQueue简单介绍
    LinkdBlockingQueue是一种基于单向链表的阻塞队列,队头和队尾是两个指针愤慨操作,所用采用了两把锁和两个条件,同时1个Atomicinteger记录count数       这里......
  • 垃圾收集器使用场景和ZGC的简单调优
    本文背景在对于去哪儿网的《ZGC在去哪儿机票运价系统实践》的这篇文章阅读之后,对于parNew+cms这对垃圾收集的组合和g1以及zgc这几种垃圾收集器有了更加深入的了解,特此形......
  • Blender建模软件怎么安装?有哪些好用的插件?
    1、下载Blender软件包,将压缩包解压后,使用鼠标左键双击打开安装文件。 2、由于压缩包内有两个安装文件,用户需要根据系统版本选择安装。可以使用鼠标右键单击桌面上的“......
  • 转载 从瀑布到敏捷——漫画解读软件开发模式变迁史
      这张图片从上向下,五个房间,分别是瀑布模型(waterfall),敏捷开发(agile),看板(KANBAN),SCRUM和精益软件开发(lean)。软件过程:软件工程是为了获得高质量软件所需要完成的一系列......
  • 抓包整理————ip 协议一[十二]
    前言简单介绍一下ip协议。正文先来看下ip协议在网络层的哪一层:应用层表示层会话层传输层网络层数据链路层物理层ip层就在网络层:其实很好想象哈,就是因为每......
  • rqlite 基于sqlite 的轻量级分布式关系数据库
    rqlite是基于sqlite做为存储的分布式关系数据库,对于分布式处理基于了raft协议包含的特性部署简单使用简单,包含了httpapi以及,命令行接口,以及clientsdk完整企业级......