開啟章節選單
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 ≤ hi ≤ N ),代表第 i 個政黨的罷工週期
輸出說明
對每組測資,輸出一行,該行包含一個整數,表示在 N 天內會實際影響生產力的罷工日總數(不重複天數,不含例假日)
解題思路
- 初始化資料結構
- 使用一個
hartals
陣列(長度為days + 1
,因為天數是從 day 1 到 day N) - 初始值為 0,代表該天目前沒有被罷工
- 模擬罷工
- 用雙重迴圈:
- 外層:天數 i = 1 ~ days
- 內層:政黨 j = 0 ~ parties-1
- 判斷:
- 如果 i 是該政黨罷工日 →
i % record_days[j] == 0
- 而且 i 不是星期五或星期六 →
i % 7 != 6 && i % 7 != 0
- 如果 i 是該政黨罷工日 →
- 如果符合條件,就把
hartals[i] = 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; }