`
king_tt
  • 浏览: 2291464 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

UVa 12174 - Shuffle

 
阅读更多

题目链接

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=513&page=show_problem&problem=3326


【题目大意】


你在听音乐播放器,它采用随机播放形式。随机播放的原理时先随机产生一个1~n的排列,然后就按这个排列顺序播放歌曲。播放完这序列的所有歌曲以后,再次随机生成一个1~n的排列,再继续播放。

现在给你一个播放历史记录,这个历史记录是不完整的,以为它是开始记录时,已经有些歌曲播放过了而没有记录到。

现在给你一段从某个时刻开始的播放音乐的历史记录,以及播放器里一共有多少首歌。

问历史记录中第一首歌可能是某个随机列表中的第几首,总共有多少种可能?


【思路】

先进行预处理,用一个bool数组ok记录,ok【i】表示以第i个位置开始的连续s个数是不是都不相同的。

然后一次枚举第一首歌是第x首,先检查前s-x首歌是不是都不相同,这个也可以先预处理判断。

之后从第x开始,判断x,x+s,x+2*s……是不是都满足条件即可。




【代码】

/*
 *
 * UVa 12174 - Shuffle
 *
 */
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

typedef long long int64;

const int INF = 0x3f3f3f3f;
const int MAXN = 100010;

int s, n;
int arr[MAXN];
int cnt[MAXN];
bool first[MAXN], ok[MAXN];


// 预处理
inline void init(){
    memset(first, 0, sizeof(first));
    memset(ok, 0, sizeof(ok));
    memset(cnt, 0, sizeof(cnt));

    first[0] = true;
    int i;
    for(i=0; i<s && i<n && !cnt[arr[i]]; ++i){
        first[i+1] = true; 
        cnt[arr[i]] = 1;
    }
    if(i==n && i<s && first[i]){
        while(i++<s)
            first[i] = true;
    }

    memset(cnt, 0, sizeof(cnt));
    ok[n] = true;
    int count=0;

    for(int i=n-1; i>=0; --i){

        if(cnt[arr[i]]++ == 0){
            ++count;
        }

        if(count == s || n-i<s&&n-i==count){
            ok[i] = true;
        }

        if(i+s-1<n){
            if(--cnt[arr[i+s-1]] == 0){
                --count;
            }
        }
    }
}

bool check(int st){
    while(st < n){
        if(!ok[st]) return false;
        st += s; 
    }
    return true;
}

int main(){
    int nCase;
    scanf("%d", &nCase);
    while(nCase--){
       

        scanf("%d%d", &s, &n);

        for(int i=0; i<n; ++i)
            scanf("%d", &arr[i]);

        init();
        int ans = 0;
        for(int i=0; i<s; ++i)
            if(first[i] && check(i))
                ++ans;
        printf("%d\n", ans);

    }
    return 0;
}


分享到:
评论

相关推荐

    UVaOJ-401(Palindromes).zip_401 Palindromes

    标题中的"UVaOJ-401(Palindromes)"表明这是一个关于解决UVa Online Judge(UVa OJ)上编号为401的编程挑战,该挑战的主题是"Palindromes",即回文串。回文串是指一个字符串无论从前读到后还是从后读到前都是相同的,...

    Uva 1510 - Neon Sign

    ### Uva 1510 - Neon Sign #### 问题背景与描述 在题目“Uva 1510 - Neon Sign”中,我们面对的是一个霓虹灯招牌设计问题。该霓虹灯招牌由一系列位于圆周上的角点组成,并通过发光管连接这些角点。发光管有两种...

    uva705-Slash-Maze-.rar_Slash_uva705

    【标题】"uva705-Slash-Maze-.rar_Slash_uva705" 指向的是一个在UVa Online Judge (UVa OJ) 上提交并通过的编程问题,具体为问题编号705,名为"Slash Maze"。这个压缩包很可能包含了该问题的解决方案源代码。 ...

    UVA100~200---52道题accept代码,均顺利accept过

    这些文件名代表的是在UVA(University of Virginia)在线判题系统上解决的编程题目,主要是C++语言编写的解决方案。UVA是一个知名的在线编程竞赛平台,它提供了大量的算法问题供程序员挑战,有助于提高编程技能和...

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip

    开源项目-codingsince1985-UVa#uva-online-judge-solutions-in-golang.zip,两年来每天都在解决一个uva在线裁判问题,算起来…

    UVA133-TheDoleQueue.zip_site:www.pudn.com_uva133

    《UVA133 - 救济金发放问题:The Dole Queue》 在计算机科学领域,算法是解决问题的关键工具,特别是在处理复杂数据结构和优化问题时。UVA(University of Virginia)在线判题系统提供了丰富的算法题目供程序员挑战...

    Algorithm-UVA-Solutions-in-Python.zip

    "Algorithm-UVA-Solutions-in-Python.zip"这个压缩包文件正是针对UVA竞赛中问题的Python 3解决方案集合。 Python作为一门易学且功能强大的编程语言,因其简洁的语法和丰富的库支持,成为了许多算法爱好者和开发者的...

    uva532-Dungeon-Master.rar_dungeon

    《UVA532 Dungeon Master:解密游戏编程的深度探索》 在计算机科学与编程领域,UVA(University of Virginia)在线判题系统是一个深受程序员喜爱的平台,它提供了丰富的算法题目供学习者挑战。其中,编号为532的...

    tpcw-nyu-uva-client 客户端

    "tpcw-nyu-uva-client 客户端"是一个专为TPCW(Transaction Processing Performance Council Workloads)设计的应用程序,由纽约大学(NYU)和弗吉尼亚大学(UVA)共同开发。这个客户端软件主要用于模拟和评估数据库...

Global site tag (gtag.js) - Google Analytics