首页 > 其他分享 >F. Array Stabilization (AND version)

F. Array Stabilization (AND version)

时间:2025-01-16 17:32:56浏览次数:3  
标签:ok int pos while version solve 数组 Stabilization Array

题目链接:Problem - 1579F - Codeforces

题目大意:给一个n,d n表示数组的长度,d表示每次将数组向右移动的长度,列入d=2,数组:1 2 3 4 5 ,那么下一次移动过后的数组为 4 5 1 2 3 . 由于数组只包含0与1,要求让移动过后的数组与前一个数组做AND运算,求多少次可以将数组变为全0, 如果不能输出-1,可以输出步数。 1<=n<=1e6, 1<=1<n, ai为0或1.

思路:通过题目的要求,我们可以知道做AND运算,只有两个1才会为1.然后通过数组的移动可以发现  每一次做AND运算,都会将整个数组的状态改变,而该状态是基于上一个数组变化而来的。可以发现要想状态改变,移动过后的数组的那个位置上要为0,与之对应的位置上为1.

做法:可以发现状态的改变而引起的,是基于上一个状态。考虑采用bfs,将当前数组里的0的下标压入队列,然后再对当前状态的所有下标进行d的移动,当发现可以改变时,又压入队列(为下一个状态)。然后记录次数即可。

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;
using i64 = long long;

void solve(){
    int n, d;
    cin >> n >> d;
    queue<int> q;
    bool ok = true;
    vector<int> a(n);
    for(int i=0; i<n; i++) {
        cin >> a[i];
        if(a[i])ok = false;
    }
    if(ok) {
        cout << 0 << "\n";
        return;
    }
    int res = 0;
    for(int i=0; i<n; i++) {
        if(a[i]==0) {
            q.push(i);
        }
    }
    while(!q.empty()) {
        int sz =q.size(); //取当前状态
        for(int i=0; i<sz; i++) {
            int x = q.front();
            q.pop();
            int pos = (x+d) % n;
            if(a[pos]==1) { //发现可以改变压队
                a[pos] = 0;
                q.push(pos);
            }
        }
        res++;
    }
    for(int i=0; i<n; i++) {  //看是否成功
        if(a[i]==1) {
            cout << "-1\n";
            return ;
        }
    }
    cout << res-1 << "\n";
}

signed main(){
    IOS;
    int T = 1;
    cin >> T;
    while(T--) {
        solve();
    }
    return 0;
}

py代码:

from collections import deque


def solve() :
    n, d = map(int,input().split())
    a = list(map(int,input().split()))
    q = deque()
    ok = True
    for i in range(n):
        if a[i]==0:
            q.append(i)
        else:
            ok = False
    if ok:
        print(0)
        return
    res = -1
    while q:
        sz = len(q)
        while sz>0:
            x = q.popleft()
            pos = (x+d) % n
            if a[pos]==1:
                a[pos] = 0
                q.append(pos)
            sz-=1
        res+=1
    for i in a:
        if i==1:
            print(-1)
            return
    print(res)
T = int(input())
while T:
    solve()
    T-=1


欢迎大佬纠正,感谢你的收看与点赞。

标签:ok,int,pos,while,version,solve,数组,Stabilization,Array
From: https://blog.csdn.net/king0304916/article/details/145142382

相关文章

  • H1. Maximize the Largest Component (Easy Version)
    题目链接:Problem-H1-Codeforces题目大意:给一个由‘.'与’#‘的字符组合成的二维矩阵,现在又有一种操作可以使每一列或每一行全部变成’#‘,然后求这个二维矩阵里的由’#‘组合成的最大连通块,求出该最大连通块的大小。输入的第一行包含一个整数 tt(1≤t≤1e4 )-测试用......
  • 解决1235 - This version of MySQL doesn‘t yet support ‘LIMIT & IN/ALL/ANY/SOME
    文章讲述了在MySQL中尝试使用IN关键字结合LIMIT子句时遇到的1235错误,即不支持LIMIT&IN/ALL/ANY/SOMEsubquery。解决方案是将子查询封装到另一个查询中,避免IN和LIMIT在同一层次。通过创建一个新的子查询来获取TOP3用户ID,然后在外层查询中使用这些ID过滤用户。SELECT *FROM `u......
  • java ArrayList集合
    ArrayList是Java中最常用的集合类之一,它位于java.util包中,属于List接口的实现类。ArrayList基于数组实现,可以动态调整大小,允许存储重复元素,并支持快速的随机访问操作。集合和数组的优势对比:长度可变添加数据的时候不需要考虑索引,默认将数据添加到末尾下面详细介......
  • Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]
    CountArrays:一眼秒的计数题。思路显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是\(1\),就会形成一个基环树森林。那么考虑这个环上能填什么数。因为所有数都小于等于他后面的数,所以所有数都只能相等。这就启发我们在基环树上缩点之后再进行计数。那么当缩完点......
  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!) B. Friendly Arrays
    Codeforces题解-[B.FriendlyArrays]题目链接题目描述Youaregiventwoarraysofintegers—\(a_1,\ldots,a_n\)oflength\(n\),and\(b_1,\ldots,b_m\)oflength\(m\).Youcanchooseanyelement\(b_j\)fromarray\(b\)(\(1\leqj\leqm......
  • 找不到 .NETFramework,Version=v4.0 的引用程序集问题
    高版本操作系统默认安装.NETFramework4.6或以上时,系统用4.0的msbuild命令编译导致找不到4.0的程序集问题1.下载nuget版本的资源包https://www.nuget.org/packages/Microsoft.NETFramework.ReferenceAssemblies.net40/microsoft.netframework.referenceassemblies.net40.1.0.3......
  • 【区间合并+贡献法】codeforces 1789 C. Serval and Toxel's Arrays
    题目https://codeforces.com/problemset/problem/1789/C题意第一行输入一个正整数\(T(1\leqT\leq10^4)\),代表\(T\)组测试用例。对于每组测试用例:第一行输入两个正整数\(n,m(1\leqn,m\leq2\times10^5)\),分别代表要输入的数组长度和修改次数。第二行输入一个长......
  • log4j的配置ConversionPattern详细讲解
    先写下我一直没找到的ConversionPattern里面参数代表的详细含义参数说明例子%c列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间log4j配置文件参数举例输出显示媒介假设当前logger......
  • 1.9 CW 模拟赛 T2. array
    思路简单的考虑梦梦的决策点为\(k\)时,如何使最大子段和最大化容易想到以下的分类讨论完全在\([1,2k-2]\cup[2k+1,2n]\)中包含\(C_{2k-1},C_{2k}\)中的任意一个包含\(C_{2k-1},C_{2k}\)考试的时候想到了这里,问题在于如何高效的解决计算这\(3\)......
  • Your cache folder contains root-owned files, due to a bug in npm error previous
    npmerrorcodeEACCESnpmerrorsyscallopennpmerrorpath/Users/mm/.npm/_cacache/index-v5/45/66/ecd3156d86d140d52bdcd310fd72139daff9b798d4a7a2e2cc681f2a3437npmerrorerrnoEACCESnpmerrornpmerrorYourcachefoldercontainsroot-ownedfiles,dueto......