救济金发放(UVa133)

  题目具体描述见:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=69

C++11代码如下:

 1 #include<iostream>
 2 #include<iomanip>
 3 using namespace std;
 4 int que[25];
 5 int n, k, m;
 6
 7 int go(int p, int d, int t) { //d表示步长,值为1表示逆时针,-1表示顺时针
 8     while (t--) {
 9         do {
10             p = (p + d + n - 1) % n + 1;  //防止(p+d)%n==0,(p+d+n-1)相当于旋转一周,最后加1
11         } while (que[p]==0);
12     }
13     return p;
14 }
15 int main() {
16     while ((cin >> n >> k >> m) && n != 0) {
17         for (int i = 1; i <= n; i++) que[i] = i;
18         int left = n;  //剩下的人数
19         int p1 = n, p2 = 1;  //起始位置
20         while (left) {
21             p1 = go(p1, 1, k);
22             p2 = go(p2, -1, m);
23             cout << setw(3) << p1;
24             left--;
25             if (p1 != p2) {
26                 cout << setw(3) << p2;
27                 left--;
28             }
29             que[p1] = que[p2] = 0;
30             if (left) cout << ‘,‘;
31         }
32         cout << endl;
33     }
34     return 0;
35 }

原文地址:https://www.cnblogs.com/pgzhang/p/9260449.html

时间: 2024-10-05 21:39:56

救济金发放(UVa133)的相关文章

UVa 133 救济金发放

题意:所有n个人围成一个圈,一边从1号开始逆时针数k个,出局:一边从n号开始顺时针数m个,出局.两个同时发生.如果这两个数到同一个人,就这个人出局. facing inwards 面朝里: counter 相反地,clockwise 顺时针,counter-clockwise 逆时针 思路:双向循环链表来模拟.按以前书上介绍的实现的,有一个头指针,首尾都指向它.但这里由于要找第k个.第m个,需要进行头指针的判断,所以觉得这里不增加头指针比较好,或者头指针只指向头结点,而头结点和尾结点是互指的,不

算法习题---4.3救济金发放(UVa133)

一:题目 (n<20 )个人站成一圈,逆时针编号为1~n.有两个官员,A从1开始逆时针数,B从n开始顺时针数.在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上).接下来被选中的人离开队伍. 输入n,k,m输出每轮被选中的人的编号(如果有两个人,先输出A的)每个输出数字正好占3列. 二:实现思路 A从数组首部向后遍历(若是该位置还有人,则步数加一,否则不改变步数),当遍历到最后,则转回首部继续遍历. B从数组尾部向前遍历(...),若是遍历到首部,则转回尾部

算法入门经典-第四章 例题4-3 救济金发放

救济金的问题抽象出来就是几个人围成一个圈坐,给每一个人编号,一个人从1开始,一个人从n开始,从一开始的点到k时,出列一人,n逆时针点人,点到m出列一人.如果我们出列用删除操作,则大大的降低了效率,我们将删除掉的人用0来代替,当我们遇到0时不点人. 使用两个方法来分别逆时针顺时针点人,如果是0,则跳过 n(n<20)个人站成一圈,逆时针编号为1-n.有两个官员,A从1开始逆时针数,B从n开始顺时针数.在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上).接下来

算法竞赛入门经典 第四章

[√ ] UVA1339 古老的密码 Ancient Cipher [√ ] UVA489 刽子手的游戏 Hangman Judge [√ ] UVA133 救济金发放 The Dole Queue [√ ] UVA213 信息解码 Message Decoding [√ ] UVA512 追踪电子表格中的单元格 Spreadsheet Tracking [√ ] UVA12412 师兄帮帮忙 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)

例题3-5,例题4-2,例题4-3

例题3-5生成元 1 #include <stdio.h> 2 #include <string.h> 3 #define maxn 100005 4 int ans[maxn]; 5 6 int main() { 7 int T, n; 8 memset(ans, 0, sizeof(ans)); 9 for (int m = 1; m < maxn; m++) { 10 int x = m, y = m; 11 while (x > 0) { 12 y += x %

递归 段错误 习题

段错误 递归里面算阶乘 f(10000000)没有输出,使用gdb 显示 SIGSEGV--段错误 编译后产生的可执行文件里面保存着什么? UNIX/Linux 用 ELF DOS下用COFF Windows用PE(COFF扩充而得) 段(segmentation) 二进制文件内的区域. 可用size程序得到可执行文件中的各个段的大小 Text Segment--正文段--储存指令 Data Segment--数据段--储存已初始化的变量 BSS Segment--BSS段--未赋值的全局变量

微信公众号可通过现金红包接口发放微信支付现金红包(附开发教程)

农历新年将至,支付宝红包打了一仗,微信在朋友圈屏蔽了它的分享,但单防守还不行,进攻才是最好的防守.昨日,微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.微信公众号也可以发放现金红包了! 通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果. 1.商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2.领取到红包后,用户的资金直接进入微信零钱,避免繁复的领

Uva133 - The Dole Queue

题意 n个人围城一个环,逆时针编号1~n,A从1开始逆时针数K个,B从n顺时针数M个,被选中的1或2个人一次领救济金,输出顺序 思路 双向约瑟夫环,公式没推出来,用的模拟 总结 开始用的数组模拟链表写的,WA了,打算再改改.不知道为什么这道题卡了很久总不对. 模拟: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using nam

在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token

OAuth真是一个复杂的东东,即使你把OAuth规范倒背如流,在具体实现时也会无从下手.因此,Microsoft.Owin.Security.OAuth应运而生(它的实现代码在Katana项目中),帮助开发者偷了不少工,减了不少料. 这篇博文试图通过一个简单的示例分享一下如何基于Microsoft.Owin.Security.OAuth,使用Client Credentials Grant授权方式给客户端发放access token. Client Credentials Grant的授权方式就