题解:UVA10050 Hartals

· · 题解

意外发现了一道红题

题目意思

总共有 n 个人,他们分别在 A[i] 的倍数天罢工,但是如果罢工的日子是周六或者周日也就是周末,那就不算罢工,求 n 天中其余罢工的天数。

思路

模拟 + 暴力,我们可以在每一次输入的时候就从 1 遍历到 n,如果他罢工了且不在周末,那么就打上一个标记,最后的答案只需要统计一下了。

AC Code

#include <iostream>
#include <string>
#include <cmath>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cstdio>
using namespace std;
#define ll long long
using namespace std;
ll A[1000000];//标记数组
ll B[1000000];
ll sum;
int main()
{
    ll t,n,m,i,j;
    cin >> t; 
    while(t--)//t组数据

        cin >> n >> m;
        memset(A,0,sizeof(A));
        for(i = 1;i <= m;i++)
        {
            cin >> B[i];//根据题意输入m个数 
        }
        ll day; 
        for(i = 1;i <= m;i++)
        {
            for(j = 1;j <= n;i++)
            {
                day = j % 7;
                if(day != 6 && day != 0)//不是周末

                    if(j % B[i] == 0)//如果是B[i]的倍数

                        A[i] = 1;//标记为一 
                    } 
                }
            }
        }
        for(i = 1;i <= n;i++)
        {
            sum += A[i];//求和,也可以在标记时直接加
        }   
        cout << sum << endl;
    } 
    return 0;
}