UVA 133“The Dole Queue”(循环报数处理技巧)
•参考资料
[1]:紫书P82
•题意(by紫书)
按照被选中的次序输出这 n 个人的编号;
如果A和B选中的是同一个人,输出一个这个人的编号;
输出格式:输出的每个编号占3个字节,不够3个字节在前面用空格补;
•循环报数处理技巧
n个人按照逆时针顺序编号1~n;
给你一个整数 k 和 cur;
cur表示从这 n 个人中任意选取的一个编号;
k > 0 : 找 cur 左手边的第 k 个人的编号;
k < 0 : 找 cur 右手边的第 k 个人的编号;
循环报数问题,需要处理的边界问题是:
编号 1 的左手边的人的编号为 n;
编号 n 的右手边的人的编号为 1;
之前常用的处理的方式为,循环处理,如果 cur 从编号 n 来到编号 n+1,特判,令其等于 1;
反之,如果 cur 从编号 1 来到编号 0,特判,令其等于 n;
下面说下一我从紫书上学到的技巧;
1 pos = (cur + k - 1 + n)%n + 1;
pos : 从cur编号顺时针或逆时针找到的第k个人的编号
k : k > ,找cur右手边的第k个人的编号,反之找cur左手边的第k个人的编号;while(~scanf("%d%d%d",&n,&cur,&k))
{
k=k%n;
int pos=(cur+k-1+n)%n+1;
cout<<pos<<endl;
}•我的理解
n个人顺时针围城一圈,从 x 位置开始,顺时针找其左(或逆时针找其右)手边的第 k 个人(-n < k < n , k > 0 顺时针找, k < 0 逆时针找);
假设 k > 0 ,那么第 k 个人的编号为:
合并这两个式子就是
nextPos = (x+k-1+n)%n+1;
简单证明这个式子得正确性:
①如果 x+k ≤ n,那么 (x+k-1+n)%n+1 = x+k;
②如果 x+k > n:
1)x+k = n+1 : (x+k-1+n)%n+1 = 1;
2)x+k > n+1 : (x+k-1+n)%n 就是目的编号的前一个编号,+1就等于目的编号;
那如果 k < 0 呢?
假设找 x 左手边的第 y 个人的编号 = 找 x 右手边的第 k 个人的编号;
那么 |k| + y = n,也就是 y = n-|k|;
带入上式得:
nextPos = (x+n-|k|-1+n)%n+1;
即 nextPos = (x-|k|-1+n)%n+1;
综上,不论 k 是大于0还是小于0,nextPos = (x+k-1+n)%n+1;
•Code
#include<bits/stdc++.h>
using namespace std;
#define memF(a,b,n) for(int i=0;i <= n;a[i++]=b); int n,k,m;
bool vis[]; int Go(int cur,int d,int x)
{
/**
d=1:逆时针找第x个人
d=-1:顺时针找第x个人
当前的cur肯定是不满足条件的位置
所以初始 a=n,b=1
之后,a,b的值就是上一次出队的编号
*/
while(x--)
{
do
{
cur=(cur+d-+n)%n+;
}while(vis[cur]);
}
return cur;
}
void Solve()
{
memF(vis,false,n); int a=n,b=;
int left=n;
while(left--)
{
a=Go(a,,k);
b=Go(b,-,m); vis[a]=true;
vis[b]=true; printf("%3d",a);
if(b != a)
{
left--;
printf("%3d",b);
}
if(left)
printf(",");
}
printf("\n");
}
int main()
{
while(~scanf("%d%d%d",&n,&k,&m) && n+k+m)
Solve(); return ;
}
UVA 133“The Dole Queue”(循环报数处理技巧)的更多相关文章
- UVA 133 The Dole Queue
The Dole Queue 题解: 这里写一个走多少步,返回位置的函数真的很重要,并且,把顺时针和逆时针写到了一起,也真的很厉害,需要学习 代码: #include<stdio.h> # ...
- uva - 133 The Dole Queue(成环状态下的循环走步方法)
类型:循环走步 #include <iostream> #include <sstream> #include <cstdio> #include <cstr ...
- UVA 133 The Dole Queue(报数问题)
题意:一个长度为N的循环队列,一个人从1号开始逆时针开始数数,第K个出列,一个人从第N个人开始顺时针数数,第M个出列,选到的两个人要同时出列(以不影响另一个人数数),选到同一个人就那个人出列. 思路: ...
- uva 133 The Dole Queue 双向约瑟夫环 模拟实现
双向约瑟夫环. 数据规模只有20,模拟掉了.(其实公式我还是不太会推,有空得看看) 值得注意的是两个方向找值不是找到一个去掉一个,而是找到后同时去掉. 还有输出也很坑爹! 在这里不得不抱怨下Uva的o ...
- uva 133(The Dole Queue UVA - 133)
一道比较难想的模拟题,用了队列等东西,发现还是挺难做的,索性直接看了刘汝佳的代码,发现还是刘汝佳厉害! 代码本身难度并不是很大,主要还是p=(p+n+d-1)%n+1;这一句有些难度,实际上经过自己的 ...
- uvaoj 133 - The Dole Queue(逻辑,环形队列数数)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- UVa133.The Dole Queue
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- The Dole Queue UVA - 133
In a serious attempt to downsize (reduce) the dole queue, The New National Green Labour Rhinoceros ...
- The Dole Queue
The Dole Queue Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit cid ...
随机推荐
- Delphi字符串处理函数
1.Copy 功能说明:该函数用于从字符串中复制指定范围中的字符.该函数有3个参数.第一个参数是数据源(即被复制的字符串),第二个参数是从字符串某一处开始复制,第三个参数是要复制字符串的长度(即个数) ...
- 成都大学CTF 网络攻防演练平台 WP
web1 输入框那里鼠标右键,审查元素,删除maxlength web2 http://ctf.cdusec.org:8082/web2/?cdusec=tql web3 同上,用火狐hackbar或 ...
- Leetcode 493.翻转对
翻转对 给定一个数组 nums ,如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对. 你需要返回给定数组中的重要翻转对的数量. 示例 ...
- ABC128F Frog Jump
题目链接 题目大意 给定一个长为 $n$ 的数组 $s$,下标从 $0$ 开始.$ 3 \le n \le 10^5$,$-10^9 \le s_i \le 10^9$,$s_0 = s_{n - 1 ...
- 简单数据结构题(from 钟子谦——IOI2018集训队自选题)
简单数据结构题(from 钟子谦--IOI2018集训队自选题) 试题描述 给一棵 \(n\) 个点的树,点权开始为 \(0\) ,有 \(q\) 次操作,每次操作是选择一个点,把周围一圈点点权 \( ...
- vue-router 页面切换后保持在页面顶部而不是保持原先的滚动位置的办法
vue-router有提供一个方法scrollBehavior,它可以使切换到新路由时,想要页面滚到顶部,或者是保持原先的滚动位置,就像重新加载页面那样. 这个功能只在 HTML5 history 模 ...
- 【03】Vue 之列表渲染及条件渲染
3.1. 条件渲染 有时候我们要根据数据的情况,决定标签是否进行显示或者有其他动作.最常见的就是,表格渲染的时候,如果表格没有数据,就显示无数据.如果有数据就显示表格数据. Vue帮我们提供了一个v- ...
- HDOJ Important Sisters
Important Sisters Time Limit: 7000/7000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- BZOJ【1606】购买干草
1606: [Usaco2008 Dec]Hay For Sale 购买干草 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 859 Solved: 63 ...
- configurationmanager.getsection usage
public static void CreateAppSettings() { // Get the application configuration file. System.Configura ...