---
# System prepended metadata

title: APCS 小群體（10603 第2 題）

---

# APCS 小群體（10603 第2 題）
:::success
![](https://i.imgur.com/wuwkpDE.png)
![](https://imgur.com/xk0Cr45.png)
:::
```cpp=
#include <iostream>

using namespace std;

const int MAXN = 50000+10;   //最大的人數
int myfriend[MAXN];           //儲存每個人的好友編號
int check[MAXN];              //紀錄是否已被檢查過


int main()
{
    int n;   //團體中人數
    while(cin>>n){
        //依序讀入n個人的好友編號存入myfriend陣列
        for(int i=0;i<n;i++){
            //將第i個人的好友編號存入
            cin>>myfriend[i];
            //第i個人還未被檢查到
            check[i]=0;
        }
        int counter=0; //小群體個數
        int next=-1;   //下一個編號(索引)
        for(int i=0;i<n;i++){
            //判斷第i個人的好友是否被檢查過
            if(!check[i]){
                //如果第i個人的好友是自己的話
                if(i==myfriend[i]){
                        counter++;  //小群體++
                        check[i]=1;   //第i個位置被檢查過時設為1
                }else{   //好友不是自己時
                    next = i;  //往下繼續找
                    //如果下一個索引沒被檢查過
                    while(!check[next]){
                        check[next]=1;   //設定下一個索引被檢查過了
                        next=myfriend[next]; //將目前檢查的索引好友編號設為下一個要檢查的好友編號
                    }
                counter++;
                }
            }
        }
        cout<<counter<<"\n";//顯示群體個數
    }
    return 0;
}

```

# APCS 定時K 彈（10510 第3 題）
:::success
![](https://imgur.com/PborYDf.png)
:::
```cpp=
#include <iostream>

#include<vector>    //for vector


using namespace std;
//宣告 vector 物件
vector<int> arr;   //儲存環狀陣列的元素


int main()
{
    int n,m,k;  //n個人數,每m次爆炸,總共爆炸k次

    while(cin>>n>>m>>k){
        //清除 arr(vector物件) 的所有元素
        arr.clear();
        //從 1~n 加入到arr(vector物件)中
        for(int i=1;i<=n;i++){
            //從尾端(tail)加入
            arr.push_back(i);
        }
        //模擬炸彈爆炸k次
        int curPos=0;
        for(int i=0;i<k;i++){
            //每間隔 m 個元素爆炸一次
            //算出要爆炸的位置索引(Joseph problem)
            curPos = (curPos + m -1) % arr.size();
            //將 curPos 的元素從 arr(vector物件) 中刪除
            arr.erase(arr.begin()+curPos);
        }
        //重新計算 curPos 在 arr(vector物件)中的索引
        curPos = curPos % arr.size();
        //輸出結果
        cout<<arr[curPos]<<"\n";
    }
    return 0;
}

```
# 棒球遊戲
:::success
![](https://imgur.com/kg8NrJ5.png)
:::
```cpp=
#include <iostream>
//#include <string>
using namespace std;
const int LINE = 9;    //9位打者
const int HIT = 5;     //每人最多打數

// 儲存每一個打者的打擊資料
int pitch[LINE];

//儲存每一個打者的打數資料
int his[LINE][HIT];

//紀錄壘包上的打者,true代表壘包上有人
bool bases[4];

int converter(string s)
{
    if(s.compare("1B")==0) return 1;
    if(s.compare("2B")==0) return 2;
    if(s.compare("3B")==0) return 3;
    if(s.compare("HR")==0) return 4;
    return 0;
}
int getScore(int x)
{
    int res = 0;    //打出x壘時總得分
    //依據壘包上是否有人且可能得分的壘包計算得分
    for(int i=3; i>3; i--){
        //如果第i個壘包目前有人
        if(bases[i]){
            //得1分
            res++;
        }
    }
    //第 i 個壘包往前推進 x 個壘包
    for(int i=3; i>x; i--){
        //第 i 個壘包變成第 i-x 壘包的值(推進x壘包來到i壘包)
        bases[i]=bases[i-x];
    }
    //全壘打
    if(x==4){
        res++;
    }
    else{
        bases[x]=true;//打者上x壘
        }
    //清空x壘之前的壘包
    for(int i=1; i<x; i++){
        bases[i]=false;
        }
    return res; //回傳打出

}

int getScore1(int x)
{
    int res = 0;
    cout<<"x="<<x<<"\n";
    if(x==1){
        res+=bases[3];
        bases[3]=bases[2];
        bases[2]=bases[1];
        bases[1]=1;
    }else if(x==2){
        res+=bases[3]+bases[2];
        bases[3]=bases[1];
        bases[2]=true;
        bases[1]=false;
    }else if(x==3){
        res+=bases[3]+bases[2]+bases[1];
        bases[3]=true;
        bases[2]=bases[1]=false;
    }else if(x==4){
        res+=bases[3]+bases[2]+bases[1]+1;
        bases[3]=bases[2]=bases[1]=false;
    }
    cout<<res<<"\n";
    return res;
}

int main(){
       string s; //紀錄打者打數的字串1B,2B,....FO,SO
    for(int i=0; i<LINE; i++){
        //第i個人的打數資料存入pitch陣列中
        cin>>pitch[i];
        //將第i個人的每一個打數資料 存入 hit 陣列中
        for(int j=0;j<pitch[i];j++){
            cin>>s;  //字串
            his[i][j] = converter(s);
            //cout<<his[i][j]<<"\n";
        }
    }
    // 總出局數
    int outs;
    cin>>outs;

    /*模擬動作開始*/
    //所有壘包清空
    bases[0]= bases[1]= bases[2]= bases[3]=0;

    //Column-Major(以行為主)讀取 HIT陣列資料
    int scores = 0;  //紀錄得分
    int out=0;         //紀錄累積出局數(3的倍數要清空所有壘包)

    for(int i=0; i<HIT && out<outs; i++){
        for(int j=0; j<LINE && out<outs; j++){
            //如果[j][i]不為0(可能會產生得分)
            if(his[j][i]){
                scores+=getScore1(his[j][i]);
                cout<<scores<<"\n";
            }
            else{
                out++;   //累計出局數加1
                if(!(out%3)){ //所有壘包清空
                   bases[3]= bases[2]= bases[1]= bases[0]=0;
                }
            }
        }
    }
    cout<<scores;


    return 0;
}

```