首页 > 其他分享 >C. New Game (二分)

C. New Game (二分)

时间:2024-10-18 21:20:48浏览次数:1  
标签:二分 pre maxx int Game New define

时隔多年又做题了这不得来水一篇博客

题意:给出n个数,取一段连续的数字,最大数和最小数的差不超过k,使得取的数最多。

解:对于每一个数,找到第最后一个连续的且与其差值不大于k的数,数一数期间一共有几个,然后取最大值。实现上先处理出连续的段,对于每一个数,找到对应的段,二分找出差值不大于k的数即可。

代码:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define maxx 200005
#define inf 1000000009
int n, k;
int a[maxx] = {0};
int sum[maxx] = {0};
int pre[maxx] = {0};

signed main(){
    int T;
    scanf("%d", &T);
    while (T--){
        scanf("%d%d", &n, &k);
        for (int i = 1; i <= n; i++){
            scanf("%d", &a[i]);
        }
        sort(a + 1, a + n + 1);
        a[n+1]=inf;
        sum[1] = 1;
        pre[1]=1;
        int now=1;
        pre[n]=n;
        for(int i=n-1;i>0;i--) {
            if (a[i+1] >= a[i] + 2){
                pre[i] = i;
            }
            else
                pre[i] = pre[i + 1];
        }
        int ans = 1;
        // for(int i=1;i<=n;i++) printf("%d ",a[i]); printf("\n");
        // for(int i=1;i<=n;i++) printf("%d ",sum[i]); printf("\n");
        // for(int i=1;i<=n;i++) printf("%d ",pre[i]); printf("\n");
        for(int i=1;i<=n;i++) {
            int l=i,r=pre[i],mid;
            // printf("%d\n",r);
            int ans1=l;
            while(l<=r){
                mid=l+(r-l)/2;
                if(a[mid] - a[i] + 1 <= k){
                    ans1=mid;
                    l=mid+1;
                }
                else
                    r=mid-1;
            }  
            // printf("%d ",ans1);
            ans = max(ans, ans1 - i + 1);
        }
        // printf("\n");
        printf("%d\n", ans);
    }
}
View Code

 

标签:二分,pre,maxx,int,Game,New,define
From: https://www.cnblogs.com/capterlliar/p/18475073

相关文章

  • [ARC185A] mod M Game 2
    [ARC185A]modMGame2题意Alice和Bob每人手里有\(n\)张牌,牌上有数字\(1,2,\cdots,n\),从Alice开始轮流出牌,若一个人出牌后场上牌数字的总和能被\(m\)整除,则这个人输掉,若两人的牌都出完后还没有人输,则Alice获胜。给出\(n,m\pod{n<m}\),问两人都进行最优操作后谁会......
  • GameObject
    基础概念GameObjcetUnity的GameObject类用于表示任何可以存在于场景中的事物。GameObject是Unity中场景的构建块,可充当用于确定GameObject外观以及GameObject作用的功能组件的容器。除了使用代码修改GameObject的属性外还可以在编辑器中选中对象,通过Inspector面......
  • bolt.new本地化运行踩坑
    接入OpenAI端点安装依赖pnpmadd@ai-sdk/openaidiff--gita/app/lib/.server/llm/model.tsb/app/lib/.server/llm/model.tsindexf0d695c..5217697100644---a/app/lib/.server/llm/model.ts+++b/app/lib/.server/llm/model.ts@@-1,9+1,34@@import{createAnthro......
  • 【算法】C++中的二分查找
    ......
  • 信息学奥赛复赛复习18-CSP-J2022-01解密-二分答案、二分找边界、二分时间复杂度、二分
    PDF文档公众号回复关键字:202410171P8814[CSP-J2022]解密[题目描述]给定一个正整数k,有k次询问,每次给定三个正整数ni,ei,di,求两个正整数pi,qi,使ni=pi×qi、ei×di=(pi−1)(qi−1)+1[输入格式]第一行一个正整数k,表示有k次询问。接下来k行,第i行三个正整数......
  • 算法->二分查找
    二分查找找>=target的第一个位置找<=target的最后一个位置classSolution{public://找>=target的第一个位置intbinarySearchLeft(vector<int>&nums,inttarget){intleft=0,right=nums.size()-1;while(left<=right){......
  • C++算法练习-day1——704.二分查找
    题目来源:.-力扣(LeetCode)题目思路分析二分查找是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从......
  • E. Card Game
    E.CardGameInthemostpopularcardgameinBerland,adeckof$n\timesm$cardsisused.Eachcardhastwoparameters:suitandrank.Suitsinthegamearenumberedfrom$1$to$n$,andranksarenumberedfrom$1$to$m$.Thereisexactlyonecardin......
  • Javascript算法——二分查找
    1.数组1.1二分查找1.搜索索引开闭matters!!![left,right]与[left,right)/***@param{number[]}nums*@param{number}target*@return{number}*/varsearch=function(nums,target){letleft=0;letright=nums.length-1;//[left,right],相等时......
  • 代码随想录算法训练营第一天|704二分查找、27移除元素、977有序数组的平方
    代码随想录算法训练营第一天|704二分查找、27移除元素、977有序数组的平方1Leetcode704二分查找题目链接:[704.二分查找](704.二分查找-力扣(LeetCode))文章链接:[代码随想录](代码随想录(programmercarl.com))视频链接:[手把手带你撕出正确的二分法|二分查找法|二分搜......