【算法学习笔记】66. 模拟法 数组链表 报数优化 SJTU OJ 4010 谁最有耐心

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

struct person
{
    int data;
    int id;
};

int l[1001],r[1001];//存储编号为i的左边的编号和右边的编号
int data[1001];//存储编号为i的耐心值
int n;//总人数

//初始化
void init(){
    cin>>n;
    for (int i = 1; i <= n; ++i)
    {
        cin>>data[i];
        l[i] = i-1;
        r[i] = i+1;
    }
    //围城一个圆
    l[1] = n;
    r[n] = 1;
} 

//删除
inline void deletePerson(int id){
    r[l[id]] = r[id];
    l[r[id]] = l[id];
}
//进行报数游戏的模拟
int game(){
    int rem = n;//还剩的人数
    int curId = 1;//当前报数的人
    bool toRight = true; //初始向右

    while(rem>1){
        //优化
        int  min = 9999999;//用来找到当前最小的耐心值
        for (int i = 1; i <= n; ++i)
        {
            if(data[i]>0 and data[i]<min)
                min = data[i];
        }
        //找到之后所有的人耐心值等量减少 减少了循环次数 类比猴子题的%N
        for (int i = 1; i <= n; ++i)
        {
            data[i] -= (min-1);
        }

        data[curId]--;
        if(data[curId]==0){
            deletePerson(curId);
            toRight = !toRight;//反向报数
            rem--;
        }

        if(toRight)
            curId = r[curId];
        else
            curId = l[curId];

    }
    return curId;
}

int main(int argc, char const *argv[])
{
    init();
    cout<<game()<<endl;
    return 0;
}
时间: 2024-09-28 19:20:22

【算法学习笔记】66. 模拟法 数组链表 报数优化 SJTU OJ 4010 谁最有耐心的相关文章

【算法学习笔记】55.DFS 记忆化搜索 SJTU OJ 1063 小M爱滑雪

Description 小M超级喜欢滑雪~~ 滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当小M滑到坡底,便不得不再次走上坡或者等待升降机来载你.小M想知道滑雪场中最长底的滑坡.滑雪场由一个二维数组给出.数组的每个数字代表点距离水平面的相对距离.下面是一个例子 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 小M可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.在上面的例子中,一条可滑行的

【算法学习笔记】42.正反DP 填充连续 SJTU OJ 1285 时晴时雨

1285. 时晴时雨 Description Taring 喜欢晴天,也喜欢雨天. Taring说:我想体验连续的K天的晴朗,去远足,去放歌:我还想再这K个晴天之后,再去体验连续的K天的云雨,去感受落雨时的轻语.这是令Taring最开心的事情了.其它的时间,Taring会在机房默默的编写着代码. 当然,Taring不想在这连续的K个晴天和连续的K个雨天里被机房的事务打扰或者被自然天气的变化中断.也就是说,这K个晴天和K个雨天必须是连续的,但是他们之间并不需要时间连续.显然的,Taring如果在感

【算法学习笔记】35.高精度 竖式乘法 SJTU OJ 1274

Description 输入a,b 输出a*b的竖式乘法,格式见样例. Sample Input1 11 9 Sample Output1 11 9 -- 99 Sample Input2 10 10 Sample Output2 10 10 --- 100 Sample Input3 101 101 Sample Output3 101 101 ----- 101 101 ----- 10201 Sample Input4 10086 2 Sample Output4 2 10086 ----

【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks

我们发现这个题里每一种“移动套餐”用的次数只有0,1,2,3 是有效的,4和0是一样的. 所以我们开一个数组rot[10]来记录这9个套餐分别用了多少次. 字典序的处理和我们的枚举顺序息息相关. 我们从 000000000 到 333333333 来枚举的话,第一个符合条件的结果当然就是所有答案中字典序最小的一个了. 枚举这个排列我们需要用9个for,当然也可以用递归来实现,不过我还是喜欢视觉感比较强烈的9个for.... 在每一种排列下,我们需要通过这些套餐的方案来计算临时结果path. 然后

【算法学习笔记】39.字符串处理 单词分割 SJTU OJ 1302 缩进格式

1302. 缩进格式 Description 小z想和小y愉快的玩耍,但是小y在写程序.程序写好了,但是小y怎么调试也过不了.小z帮小y看了一下就不想看了,因为小y虽然是萌妹子,但是她的程序缩进实在是不忍直视.于是小z决定帮她纠正. 程序里的每一行语句分为单词和空格,ASCII码从33到126的一段连续字符串是单词,而单词之间由ASCII码为32的空格分开.小z的缩进方法具体来说是这样:对于每一行的第 i 个单词,它的第一个字符的位置不能小于其它每一行的第 1 至第 i−1 个单词,且每个单词的

【算法学习笔记】44. 并查集补充 SJTU OJ 3015 露子的星空

[题目描述] 已经深夜了,露子仍然在公园里仰望星空.你走近后,她对你说:“呜—,你看夜空中的星星.它们本来都是孤独地毫无联系,但人们赋予了它们各种地联想,在它们之间连上了线,便形成了夜空中无数的星座.”你回答:“是啊.为什么我们不自己创造一个美丽的星空呢?” 假设夜空中一共有n颗星星,它们初始时都没有连线.接下来,露子会给你m条指令.一共有以下三种指令: 1.在某两颗星星间连线.(可能会重复连接两颗星星) 2.询问你当前夜空中一共有多少个星座. 3.某两颗星星当前是否属于同一个星座. 其中星座是

【算法学习笔记】57. 前缀树 字典序优化技巧 STL学习 SJTU OJ 1366 前缀匹配

Description 给出一个总字符个数大小不超过1,000,000的字典(这个字典的单词顺序不为字典序)和不超过1000个长度不超过1000的前缀,输出字典中匹配该前缀,字典序为K_i的单词在字典中的位置. 所有单词都为小写字母. Input Format 第一行: 两个整数N,M,分别表示字典中的单词个数和需要查询的前缀数. 接下来N行:每行一个字符串,表示字典中的单词. 接下来M行,每行一个K_i, P_i, P_i表示查询的前缀,K_i表示满足这个前缀在字典序中的位置. Output

算法学习笔记 KMP算法之 next 数组详解

最近回顾了下字符串匹配 KMP 算法,相对于朴素匹配算法,KMP算法核心改进就在于:待匹配串指针 i 不发生回溯,模式串指针 j 跳转到 next[j],即变为了 j = next[j]. 由此时间复杂度由朴素匹配的 O(m*n) 降到了 O(m+n), 其中模式串长度 m, 待匹配文本串长 n. 其中,比较难理解的地方就是 next 数组的求法.next 数组的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀,也可看作有限状态自动机的状态,而且从自动机的角度反而更容易推导一些. "前

算法学习笔记 最短路

图论中一个经典问题就是求最短路,最为基础和最为经典的算法莫过于 Dijkstra 和 Floyd 算法,一个是贪心算法,一个是动态规划,这也是算法中的两大经典代表.用一个简单图在纸上一步一步演算,也是很好理解的,理解透自己多默写几次即可记住,机试时主要的工作往往就是快速构造邻接矩阵了. 对于平时的练习,一个很厉害的 ACMer  @BenLin_BLY 说:"刷水题可以加快我们编程的速度,做经典则可以让我们触类旁通,初期如果遇见很多编不出,不妨就写伪代码,理思路,在纸上进行整体分析和一步步的演算