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;
}