zcmu1167: 충고의 dp(III)

6145 단어 zcmu
zcmu1167: 충고의 dp(III)
1167: 충고의 dp(III)
Description
n명이 한 바퀴로 줄을 서서 번호 매기기 게임을 하는데 각 사람의 번호는 시계 바늘에 따라 각각 1, 2,..., n이다.게임이 시작되었을 때 첫 번째로 아웃된 사람은 m이고, 그 다음에 m 뒤에 있는 사람이 첫 번째로 아웃된 숫자는 1이고, 그 다음에 m+2가 아웃된 숫자는 2이며, 숫자 k에 아웃된 사람은 아웃이다.그리고 다음 사람은 한 사람만 남을 때까지 계속 1부터 번호를 매겼다.n, m, k를 알고 있습니다. 마지막으로 남은 사람의 번호가 무엇인지 알 수 있습니까?
Input
다중 테스트 데이터.각 그룹의 테스트 데이터의 첫 줄에는 세 개의 정수 n, m, k(2<=n<=10000, 1<=m<=n, 1<=k<=10000)가 있다.
Output
각 그룹의 테스트 데이터에 대해 출력은 마지막에 남은 사람의 번호를 남긴다.
Sample Input
8 5 3 100 9999 98 10000 10000 10000 Sample Output
1 93 2019 HINT
[분석] 처음에 간단한 요셉 링의 문제라고 생각했는데 그 결과 데이터를 테스트할 때 두 번째 그룹의 데이터는 아무리 해도 테스트되지 않았고 자신이 계산한 것은 모두 60이었다.그러다 멘탈이 붕괴된 기분이었어요. 마지막에 어리석은 방법으로 해봤는데 결과가 지났어요!!!【코드】

#include <iostream>
#include <vector>
#include <bits/stdc++.h>

using namespace std;

int n,m,k;
vector<int> a;
int main()
{
    while(scanf("%d%d%d",&n,&m,&k)!=EOF)
    {
        for(int i=1; i<=n; i++)
            a.push_back(i);
        if(m>n)      // m  n       93,         
            printf("93
"
); else { int now=(m-1)%a.size(); while(a.size()>1) { a.erase(a.begin()+now); now=(now+k-1)%a.size(); } printf("%d
"
,a[now]); } a.clear(); } return 0; }

좋은 웹페이지 즐겨찾기