1. 程式人生 > >演算法競賽入門經典(紫書)第四章—— The Dole Queue UVA-133

演算法競賽入門經典(紫書)第四章—— The Dole Queue UVA-133

題意:
將 N 個數寫在一個環上,順時針數 k 個得到 x1,逆時針數 m 個得到 x2,將 x1 和 x2 輸出,如果相同則只輸出其中一個,輸出後將其從環上刪除。如此反覆。

思路:
將環想象成陣列,在陣列上演示題意的過程,即有兩個指標,一個向右移動,一個向左移動,當向右移動的指標移到結尾時再移動就會落在開頭位置,當向左移動的指標移動到開頭位置時,再移動就會移動到結尾處。
一開始我想的是用 vector 來存,這樣可以直接刪除,但是刪除的邏輯比較麻煩,用陣列直接做標記要來得簡單許多。
我們可以將選中輸出的數打上標記,這樣就知道哪些數已經輸出過了。
下面是對題目中樣例的圖解:

注意:
1. 輸出時要用 “%3d”,不能用 ” %d”,我就在這個坑裡摔了。。
2. 值得注意的是 x1 和 x2 是在輸出後一起被刪除的,而不是數出了 x1 後將 x1 刪掉再去數 x2,注意這兩者的不同。因為如果是後者的情況,數 x2 時如果會遇到 x1 則不會把 x1 算進去,由於 x1 已經被刪掉了。

程式碼:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<stack>
#include<queue>
#include<utility>
#include<vector> #include<cmath> #include<set> #include<map> #include<iostream> #include<algorithm> #include<sstream> using namespace std; typedef long long LL; int N, k, m; int num[50]; int main() { //freopen("in.txt", "r", stdin); while(scanf("%d%d%d"
, &N, &k, &m)==3 && N!=0 && k!=0 && m!=0){ memset(num, 0, sizeof(num)); for(int i=1; i<=N; i++){ num[i] = i; } int p = 0; int q = N+1; int s = N; while(s){ for(int i=0; i<k; i++){ do{ p++; if(p == N+1) p = 1; }while(num[p] == 0); } for(int i=0; i<m; i++){ do{ q--; if(q == 0) q = N; }while(num[q] == 0); } if(p != q){ s -= 2; printf("%3d%3d", num[p], num[q]); num[p] = num[q] = 0; }else { s--; printf("%3d", num[p]); num[p] = 0; } if(s) printf(","); else printf("\n"); } } return 0; }

相關推薦

演算法競賽入門經典—— The Dole Queue UVA-133

題意: 將 N 個數寫在一個環上,順時針數 k 個得到 x1,逆時針數 m 個得到 x2,將 x1 和 x2 輸出,如果相同則只輸出其中一個,輸出後將其從環上刪除。如此反覆。 思路: 將環想象

演算法競賽入門經典——Spreadsheet Tracking UVA-512

題意: 模擬表格的操作:插入行、列,刪除行、列,交換格子 題目要求對給出的格子座標,輸出一系列操作後的格子座標或 GONE。 思路: 我們的思路是記錄下操作,然後對每一個座標進行一遍操作。 先來講記錄操作,我直接用 int 陣列記錄的,可以將操作進

演算法競賽入門經典第二版陣列和字串習題3-4週期串

如果一個字串可以由某個長度為k的字串重複多次得到,則稱該串以k為週期。例如abcabcabc以3為週期(注意,它也以6和12為週期)。輸入一個長度不超過80的字串,輸出其最小週期 #include<stdio.h> int main() { char a[100];

演算法競賽入門經典第二版陣列和字串習題3-3數數字

把前n(n<=10000)個整數順次解除安裝一起:123456789101112…數一數0~9各出現多少次(輸出10個整數,分別是0,1,…,9出現的次數) #include<stdio.h> #define N 100000 char s[N],temp[10]; i

演算法競賽入門經典第二版陣列和字串習題3-2分子量

給出一種物質的分子式不帶括號,求分子量。本題中的分子式只包含4種原子分別為CHON,原子量分別為12.01,1.008,16.00,14.01(單位g/mol)。例如,C6H5OH的分子量是94.108g/mol #include <stdio.h> int main() {

演算法競賽入門經典第二版陣列和字串習題3-1得分

給出一個由O和X組成的串(長度1-80)統計得分。每個O的得分為目前連續出現的O的個數,X的得分為0。 #include <stdio.h> int main() { int b=0,c=0; int j=1; char a[80]; scan

演算法競賽入門經典第二版陣列和字串中競賽題目例題3-5 生成元

如果x加上x的各個數字之和得到y,就說x是y的生成元。給出n(1<=n<=100000)求最小生成元。無解輸出0.例如n=216時的解為198 分析 本題看起來是個數學題實則不然。假設所求生成元為m不難發現m<n.換句話說只需列舉所有的m<n看看有沒有哪個數是n的

演算法競賽入門經典第二版陣列和字串中競賽題目例題3-4猜數字

實現一個經典猜數字遊戲。給定答案序列和使用者猜的序列,統計有多少數字位置正確A,有多少數字在兩個序列都出現過但位置不對B 輸入包含多組資料。每組第一行為序列長度為n,第二行是答案序列,接下來是若干猜測序列。猜測序列全0時該組資料結束。n=0時輸入結束 [分析] 直接統計可得A,為

演算法競賽入門經典第二版陣列和字串中競賽題目選講例題3-3迴文詞

輸入一個字串,判斷它是否為迴文串以及映象串。輸入字串保證不含數字0。所謂迴文串,就是反轉以後和原串相同,如abba和madam。所有映象串,就是左右映象之後和原串相同,如2S和3AIAE。注意,並不是每個字元在映象之後都能得到一個合法字元。在本題中,每個字元的映象如圖3-3所示(空白

演算法競賽入門經典第二版陣列和字串中競賽題目選講例題3-2WERTYU

把手放在鍵盤上時,稍不注意就會往右錯一位。這樣,輸入Q會變成輸入W,輸入J會變成輸入K等。 輸入一個錯位後敲出的字串(所有字母均為大寫),輸出打字員本來想打出的句子。輸入保證合法,即一定是錯位之後的字串。例如輸入中不會出現大寫字母A。 #include<stdio.h> ch

演算法競賽入門經典第二版陣列和字串中競賽題目選講1

3-1例題tex中的引號 在TeX中,左雙引號是“"”,右雙引號是“"”,輸入一篇包含雙引號的文章你的任務是把它轉換成tex的格式 樣例輸入: “you are smart,” 樣例輸出 “you are smart,” 使用fgetc(fin)可以開啟的檔案f

演算法競賽入門經典第二版陣列和字串例題與提示下

程式3-3蛇形填數 在nxn方陣裡填入1,2,……,nxn,要求填成蛇形。 例如,n=4時方陣為: 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 上面方陣中多餘空格只是為了便於觀察規律 可以用int a[max][m

演算法競賽入門經典第二版陣列和字串例題與提示上

3.1陣列 程式3-1 逆序輸出 #include<stdio.h> #define max 105 int a[max]; int main() { int x,n=0; while(scanf("%d",&x)==1) {

演算法競賽入門經典第二版-題目集合【例題+習題】

寫在前面 還是感覺自己以前一直都是野路子,一直沒有系統的照著一本書練完過,現在隊友都在學校打多校聯賽,我還回不去就先照著這個來,試試效果完善一下自己的技能樹。也方便給後人鋪路 PS:合集還在不停更新中 題解用外鏈放出來方便查詢,不再寫到一個部落格裡了,

演算法競賽入門經典第二版第二迴圈結構程式設計註解與習題下

2-4子序列的和 輸入兩個正整數n<m<10^6,輸出1/ n^2+1/ (n+1)^2+……+1/ m^2,保留5位小數。輸入包含多組資料,結束標記為n=m=0.提示:本題有陷阱 本題思路在於乘法溢位的問題 陷阱就是關於int型別的極限,因為Int的上限是2^32-

演算法競賽入門經典第二版第二迴圈結構程式設計註解與習題上

習題2-1水仙花數 輸出100-999中的所有水仙花數。若三位數ABC滿足ABC=A^3+ B^3+ C^3,則稱其為水仙花數。例如153= 1^3+ 5^3+ 3^3,所以153是水仙花數 #include<stdio.h> int main() { in

演算法競賽入門經典第二版第二迴圈結構程式設計例題與提示下

2.3 迴圈的代價 例題2-4階乘之和 輸入n,計算s=1!+2!+3!+…+n!。n<=le-6。 樣例輸入: 10 樣例輸出: 37913 //第一個版本 int main() { int n,s=0; scanf("%d",

演算法競賽入門經典第二版第二迴圈結構程式設計例題與提示上

2.1for迴圈 儘管for迴圈反覆執行相同的語句,但這些語句每次執行效果往往不同 建議儘量縮短變數的定義範圍。例如,在for迴圈的初始化部分定義迴圈變數 編寫程式時要特別留意“當前行”的跳轉和變數的改變 例題 2-1 aabb 輸

演算法競賽入門經典第二版》pdf

第1部分 語言篇 第1章 程式設計入門 1 1.1 算術表示式 1 1.2 變數及其輸入 3 1.3 順序結構程式設計 6 1.4 分支結構程式設計 9 1.5 註解與習題 13 1.5.1 C語言、C99、C11及其他 13 1.5.2 資料型別與輸入格式

演算法競賽入門經典第二版 pdf

第1部分 語言篇第1章 程式設計入門 11.1 算術表示式 11.2 變數及其輸入 31.3 順序結構程式設計 61.4 分支結構程式設計 91.5 註解與習題 131.5.1 C語言、C99、C11及其他 131.5.2 資料型別與輸入格式 141.5.3 習題 151.5.4 小結 16第2章 迴圈結構程