zoukankan      html  css  js  c++  java
  • UVa LA 3882

    题目

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1883


    题意

    共有n个数(1..n)围成一个首尾相接的环,从m开始删除,每隔k个删除,最后留下来的是几?

    思路

    如刘书,首先是要找到递推关系。

    1. 把起点视作编号0,f[n]为还剩下n个数(编号当然是紧挨的)的时候留下的最后一个编号,那么,明显f[n]与f[n - 1]有关系

    2. 具体有什么关系呢?f[n]剩下的最后一个元素对应n个编号,删除第0个,重新以第k个编号为新起点的n-1个元素对应的f[n - 1],对应到公式上为(f[i - 1] + k - 1) % (i - 1) + 1

    3. 现在不是从0开始,而是从m开始,也就是说最后还存在一个关系为:编号j的元素对应的值为(j + m - 1) % n + 1 

    感想

    1. 和刘汝佳的算的不一致,不太理解刘书怎么算的,也许定义方式略有不同?

    代码

    #include <algorithm>
    #include <cassert>
    #include <cmath>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <map>
    #include <queue>
    #include <set>
    #include <string>
    #include <tuple>
    #define LOCAL_DEBUG
    using namespace std;
    const int MAXN = 1e4 + 4;
    int f[MAXN];
    
    int main() {
    #ifdef LOCAL_DEBUG
        freopen("C:\Users\Iris\source\repos\ACM\ACM\input.txt", "r", stdin);
        //freopen("C:\Users\Iris\source\repos\ACM\ACM\output.txt", "w", stdout);
    #endif // LOCAL_DEBUG
        //int T;
    //    scanf("%d", &T);
        int n, k, m;
        for (int ti = 1;scanf("%d%d%d", &n, &k, &m) == 3 && n; ti++) {
            f[1] = 0;
            for (int i = 2; i <= n; i++) {
                f[i] = (f[i - 1] + k - 1) % (i - 1) + 1;
            }
            int ans = (m - 1 + f[n]) % n;
            printf("%d
    ", ans + 1);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    两数之和
    IDEA类的旁边有个对勾
    Markdown 常用语法
    GitLab 使用指南(IntelliJ IDEA)
    Python yield 用法
    Mac for MySQL 5.7 安装教程
    Mac Hadoop2.6(CDH5.9.2)伪分布式集群安装
    Hive 建外链表到 Hbase(分内部表、外部表两种方式)
    hive grouping sets 等聚合函数
    hive row_number等窗口分析函数
  • 原文地址:https://www.cnblogs.com/xuesu/p/10419344.html
Copyright © 2011-2022 走看看