排队 (暴力枚举) (智算之道初赛高校组第一场)

题目列表

共 10 个测试点 每个测试点 10 分
每个测试点限时 1 秒 运行内存上限 512MB

小 A 现在站在一个 n 个人的队伍里排队,他们的编号依次为1∼n,现在她面前有 m 个窗口,其中第 i 个窗口会给出一个数字ai,然后将队伍中所有编号为 ai倍数的人带出队伍,请问最后队伍中还剩下多少个人?

输入格式
第一行两个用空格隔开的整数分别表示 n,m
第二行 m个用空格隔开的整数,其中第 i 个代表ai

输出格式
输出一个整数,代表剩下多少个人

数据规模与约定
对于 30%的数据,1 <= n <=100,1 ≤ m ≤ 10
对于 60% 的数据,1 <= n <= 1000,1 ≤ m ≤ 10
对于100%的数据,1 ≤ n ≤ 100000,1 ≤ m ≤ 100

样例输入
10 3
3 4 5
样例输出
3

思路: 自己对于每个数遍历m个窗口看其是否为窗口的倍数。

代码实现:

#include
#define endl '\n'
#define null NULL
#define ll long long
#define int long long
#define pii pair
#define lowbit(x) (x &(-x))
#define ls(x) x<<1
#define rs(x) (x<<1+1)
#define me(ar) memset(ar, 0, sizeof ar)
#define mem(ar,num) memset(ar, num, sizeof ar)
#define rp(i, n) for(int i = 0, i < n; i ++)
#define rep(i, a, n) for(int i = a; i <= n; i ++)
#define pre(i, n, a) for(int i = n; i >= a; i --)
#define IOS ios::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int way[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
using namespace std;
const int  inf = 0x7fffffff;
const double PI = acos(-1.0);
const double eps = 1e-6;
const ll   mod = 1e9 + 7;
const int  N = 1e5 + 5;

int n, m;
int a[N], b[N];

signed main()
{
    IOS;
    
    cin >> n >> m;
    for(int i = 1; i <= m; i ++)
        cin >> b[N];
    for(int i = 1; i <= n; i ++){
        for(int j = 1; j <= m; j ++){
            if(i % b[j] == 0){
                a[i] = 1;
                break;
            }
        }
    }
    int ans = 0;
    for(int i = 1; i <= n; i ++)
        if(!a[i]) ans ++;
    cout << ans << endl;
        
    return 0;
}

你可能感兴趣的:(比赛&训练)