Codeforces Round #584 - Dasha Code Championship - Elimination Round (rated, open for everyone, Div. 1 + Div. 2)

A

n个数字,如果是倍数关系,那么就是一组的,求最少要几组

#include <iostream>
#include <cstdio>
#include <algorithm>
#define rep(i,a,n) for(int i=a;i<n;i++)
using namespace std;
const int N=105;
int a[N];
int ans;
int main(){
    int n;
    scanf("%d",&n);
    rep(i,0,n)scanf("%d",&a[i]);
    sort(a,a+n);
    rep(i,0,n){
        int cnt=1;
        rep(j,0,i)if(a[i]%a[j]==0)cnt=0;//如果能除就是一组,不能除就不是一组
        ans+=cnt;
    }
    printf("%d\n",ans);
}

B

给出一个数n表示灯的数
再给出灯的初始情况,1代表亮,0,代表灭
再给出变化情况,b,b+a,b+2*a。。。的时间的时候回改变状态,且会持续a个时间

accumulate()函数,就是循环求和函数,在numeric库里面

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <numeric>
#define rep(i,a,n) for(int i=a;i<n;i++)
using namespace std;
const int N=1005;
char s[N];
int a[N],b[N],f[N];
int main(){
    int n;
    scanf("%d",&n);
    scanf("%s",s);
    rep(i,0,n)f[i]=s[i]-'0';
    rep(i,0,n)scanf("%d%d",a+i,b+i);
    int ans=accumulate(f,f+n,0);//三个参数,头,尾地址,初始值,最后求和
    rep(i,0,100000){//默认执行100000s
        rep(j,0,n){//对每一个灯进行
            if(i>=b[j]&&(i-b[j])%a[j]==0)f[j]^=1;//改变状态,f[i]记录每个时刻灯的情况,如果需要改变,就取异或0变1,1变0
        }
            ans=max(ans,accumulate(f,f+n,0));
    }
    printf("%d\n",ans);

    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Emcikem/p/11521511.html