uvalive 4727 jump跳跃(dp/约瑟夫问题变形)



题意是: 个数组成一个环,从第k个元素开始删除,每隔k个元素删一个,问最后删除的三个是什么

思路:约瑟夫问题变形,倒数第二个第三个求法与最后一个元素求法相同

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<map>
#include<set>
#define eps 1e-6
#define LL long long
using namespace std;  

const int maxn = 500000 + 100;
const int INF = 0x3f3f3f3f;
//freopen("input.txt", "r", stdin);
int f1[maxn], f2[maxn], f3[maxn], n, k;

void cal_f() {
	f3[3] = (k-1) % 3;
    f2[3] = (k%2 == 0 ? (2+f3[3])%3 : (1+f3[3])%3);
	f1[3] = 3 - f2[3] - f3[3];
	for(int i = 4; i <= n; i++) {
		f1[i] = (f1[i-1]+k) % i;
		f2[i] = (f2[i-1]+k) % i;
		f3[i] = (f3[i-1]+k) % i;
	}
	f1[n]++; f2[n]++; f3[n]++;
}

int main() {
	int t; scanf("%d", &t);
	while(t--) {
		scanf("%d%d", &n, &k);
		cal_f();
		//for(int i = 3; i <= n; i++) printf("%d %d %d\n", f3[i], f2[i], f1[i]);
		printf("%d %d %d\n", f3[n], f2[n], f1[n]);
	}
	return 0;
}
时间: 2024-08-13 13:57:20

uvalive 4727 jump跳跃(dp/约瑟夫问题变形)的相关文章

UVALive 4727 Jump

分析: 如果问题是要求最后一个删除的数,重新编号为0到n-1,f[n]表示答案,那么f[n] = (f[n-1]+k)%n. 因为删掉下标k-1以后可以从下标k重新编号为0. 在这个问题只需要推出最后三个树,然后三个数一起转移即可. 单个case的复杂度O(n) #include<bits/stdc++.h> using namespace std; const int maxn = 5e5+1; int f[maxn][3]; //#define LOCAL int main() { #if

Poj 3517 And Then There Was One(约瑟夫环变形)

简单说一下约瑟夫环:约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 想要求出最后剩下的那个人的在初始的时候的编号的话. f[1]=0; f[i]=(f[i-1]+m)%i;  (i>1) 可以推出剩下i个人内叫到m的时候的编号.注意这是逆推.推到最后初始的时候的情况 #include<stdio.h>

HDU 5643 King&#39;s Game | 约瑟夫环变形

经典约瑟夫环 1 int f[N] ={ 0 }; 2 for(int i=2; i<=n; i++) 3 { 4 f[i] = (f[i-1] + k) % i; 5 } 变形:k是变化的 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <stdlib.h> #include <queue> #in

And Then There Was One(约瑟夫问题变形)

题目链接:http://poj.org/problem?id=3517 And Then There Was One Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5014   Accepted: 2685 Description Let’s play a stone removing game. Initially, n stones are arranged on a circle and numbered 1, …

【约瑟夫环变形】UVa 1394 - And Then There Was One

首先看到这题脑子里立刻跳出链表..后来继续看如家的分析说,链表法时间复杂度为O(n*k),肯定会TLE,自己才意识到果然自个儿又头脑简单了 T^T. 看如家的分析没怎么看懂,后来发现这篇自己理解起来更容易(...)共享一下~http://blog.csdn.net/chenguolinblog/article/details/8873444 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 编号0~(n-1)是有意义的,因为要

【UVa】Jump(dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4198 约瑟夫变形 根据f(n)=(f(n-1)+m)%n 因为是求倒数第几个 那么我们只要求出f(倒数第几个)的值然后再带进去即可. (没理解的自行面壁..) 而f(倒数第几个)=(m-1)%倒数第几个 然后就行了.. #include <cstdio> #include <

LA UVaLive 7374 Racing Gems (DP,LIS)

题意:以辆赛车可以从x轴上任意点出发,他的水平速度允许他向每向上移动v个单位,就能向左或向右移动v/r个单位(也就是它的辐射范围是个等腰三角形) 现在赛车从x轴出发,问它在到达终点前能吃到的最多钻石. 析:那个v是怎么变那个是不变的.比例考虑每个钻石的向下辐射范围,并且将其投影到x轴上的两个点,(辐射范围与x轴的两个焦点),然后我们就把题目转化成了一个区间覆盖问题, 我们用x<y表示x区间被y区间覆盖,即求二维最长的上升子序列:a1<=a2<=...<=an. 我们按每个钻石的左端

UVaLive 6697 Homework Evaluation (DP)

题意:给出一个长字符串,再给一个短字符串,进行匹配,如果第i个恰好匹配,则 +8,:如果不匹配,可以给长或短字符串添加-,先后匹配,这样-3, 连续的长字符串添加-,需要减去一个4:也可不给添加-,则-5. 析:dp[i][j][0] 表示第一个字符串第 i 个位置,和第二个字符串的第 j 个位置相匹配,dp[i][j][1] 表示第一个字符串第 i 个位置,和第二个字符串的第 j 个位置加_相匹配. 那么怎么转移呢?如果s1[i] == s2[j] 那么 dp[i+1][j+1][0] = M

UVaLive 6853 Concert Tour (DP)

题意:给定 n 个城市,m 个月,表示要在这 n 个城市连续 m 个月开演唱会,然后给定每个月在每个城市开演唱会能获得的利润,然后就是演唱会在不同城市之间调动所要的费用, 问你,怎么安排这 n 个演唱会是最优的. 析:很明显的一个DP题,并且也不难,用dp[i][j] 表示在第 i 个月,在第 j 个城市开演唱会,是最优的.那么状态转移方程也就出来了 dp[i][j] = Max(dp[i][j], dp[i-1][k]-f[k][j]+p[j][i]); 代码如下: #pragma comme