UVA:133 救濟金的發放
阿新 • • 發佈:2018-12-26
思路:過程模擬,模擬每一次選中出局的操作,知道最後沒有人時。
注意:1、避免進行陣列的刪除可以使用將刪除的數字置為0
2、對環的操作是個難點,如何實現線性陣列首尾相連構成環,需要注意陣列的下標問題
3、計算選中的人的數時,需要注意我們使用0代表出局的人,所以數到0時代表該位置為空不應該算數,需要數到非零時才算數
4、輸出格式也是個注意事項,個位數輸出兩個空格,十位數輸出一個空格(presentation error輸出格式錯誤
#include <stdio.h> #include <iostream> using namespace std; //成功 int n,k,m; int size; int number(int *a,int r,int a1,int b,int k1,int m1){//用來計算下一個需要踢出的位置 if(a1==1){//a時 do{ r++; if(r>=n)r=r-n; if(r<=0)r=r+n; if(a[r]!=0)//只有當前有人的時候計數才有用,為0時計數沒用 { k1--; } }while(k1>0); return r; }else{//b時 do{ r--; if(r>=n)r=r-n; if(r<=0)r=r+n; if(a[r]!=0) { m1--; } }while(m1>0); return r; } return r; } void test(){ int a[n+2]; for(int i=0;i<=n+1;i++){ a[i]=i; } a[0]=-1; int ra=0,rb=n+1; while(size>0){ ra=number(a,ra,1,0,k,0);//計算a和b的下一個數字 rb=number(a,rb,0,1,0,m); if(ra==rb){//如果a和b指向同一個人 if(a[ra]>=10)cout<<" "; else cout<<" "; cout<<a[ra]; a[ra]=0; size--; }else{//a和b指向不同人時分別剔除 if(a[ra]>=10)cout<<" ";//十位數字時輸出一個空格,個位數字輸出兩個空格 else cout<<" "; cout<<a[ra]; a[ra]=0; size--; if(a[rb]>=10)cout<<" "; else cout<<" "; cout<<a[rb]; size--; a[rb]=0; } if(size>0)//最後一個不輸出逗號 cout<<","; } } int main(){ cin>>n>>k>>m; while(n!=0){//不為0時輸入 size=n; test(); cout<<endl; cin>>n>>k>>m; } }