開啟章節選單

10050 Hartals

題目連結

題目敘述

在某個國家裡,政治是一件極端而熱衷的事。國內有許多政黨,每個政黨有自己的一套發動 罷工日(hartal day) 的規則

當一個政黨發動罷工日時,該國的勞工階層會不上班,因此國家的生產力會受到影響
每個政黨有一個固定的週期 hi ,意即該政黨每隔 hi 天就會發動一次罷工(從第一天開始算起)
例如,若 hi = 3 ,則該政黨會在第 3、6、9、12 …… 天發動罷工
不過,該國每週有兩天是 例假日(不工作):星期五和星期六(第 6 天與第 7 天週期性循環),在例假日發動的罷工不會影響實際工作,因此不算在影響生產力的天數中

問題描述

給定一段模擬天數 N ,以及各政黨的罷工週期,請你計算在 N 天內,**會造成實際生產力受影響的天數(罷工日但不是例假日)**總共有多少天

輸入說明

  • 第一行是一個整數 T ,表示有 T 組測資
  • 每組測資的格式如下:
    • 第一行一個整數 N (1 ≤ N ≤ 3650),模擬總天數
    • 第二行一個整數 P (1 ≤ P ≤ 100),政黨數量
    • 接下來 P 行,每行一個正整數 hi (1 ≤ hiN ),代表第 i 個政黨的罷工週期

輸出說明

對每組測資,輸出一行,該行包含一個整數,表示在 N 天內會實際影響生產力的罷工日總數(不重複天數,不含例假日)

解題思路

  1. 初始化資料結構
  • 使用一個 hartals 陣列(長度為 days + 1,因為天數是從 day 1 到 day N)
  • 初始值為 0,代表該天目前沒有被罷工
  1. 模擬罷工
  • 用雙重迴圈:
    • 外層:天數 i = 1 ~ days
    • 內層:政黨 j = 0 ~ parties-1
    • 判斷:
      • 如果 i 是該政黨罷工日 → i % record_days[j] == 0
      • 而且 i 不是星期五或星期六 → i % 7 != 6 && i % 7 != 0
    • 如果符合條件,就把 hartals[i] = 1,代表該天被罷工
  1. 計算結果
  • 再用一個迴圈,從 day 1 ~ days,累加 hartals[i] == 1 的天數,就是總損失工作天數

程式碼

#include <bits/stdc++.h>
using namespace std;

int main(){
    int t;
    cin>>t;
    for(int tt=0;tt<t;tt++){
        int days;
        cin>>days;
        int parties;
        cin>>parties;
        vector<int> record_days(parties),hartals(days+1,0);
        for(int i=0;i<parties;i++)cin>>record_days[i];
        for(int i=1;i<=days;i++){
            for(int j=0;j<parties;j++){
                if( !( i%record_days[j] ) && (i%7!=6) && (i%7!=0) ){
                    hartals[i]=1;
                }
            }
        }
        int ans = 0;
        for(int i=1;i<=days;i++)if(hartals[i])ans++;
        cout<<ans<<endl;
    }
    return 0;
}