输入样例1:
5
1 1 1 0 0
0 1 1 1 1
输出样例1:
3
输入样例2:
3
0 0 0
0 0 0
输出样例2:
-1
输入样例3:
4
1 1 1 1
1 1 1 1
输出样例3:
-1
输入样例4:
9
1 0 0 0 0 0 0 0 1
0 1 1 0 1 1 1 1 0
输出样例4:
4
贪心
-
从题目可以推导出,a[i]=0,b[i]=0与a[i]=1,b[i]=1的两种一定对∑i=1,n a[i]×p[i] > ∑i=1,n b[i]×p[i]是没有贡献的
-
只有a[i]=0,b[i]=1与a[i]=1,b[i]=0对结果有影响,故设置他们的p[i]=1(最小正整数)
-
则我们计算a[i]=0,b[i]=1的个数为cnt01,a[i]=1,b[i]=0的个数cnt10
-
只需要cnt10*p > cnt01 即可,
-
此时cnt01的每个a[i]=0,b[i]=1位置的p[i] = 1
-
cnt10的每个a[i]=0,b[i]=1位置的p[i]值为p/cnt10向上取整
-
特殊情况:当a[i]=1,b[i]=0的情况不存在,那么一定无法形成∑i=1,n a[i]×p[i] > ∑i=1,n b[i]×p[i]
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int main(int argc, char** argv) {
int n;
cin>>n;
int a[n],b[n];
for(int i = 0;i<n;i++) cin>>a[i];
for(int i = 0;i<n;i++) cin>>b[i];
int cnt00 = 0,cnt01 = 0, cnt10 = 0, cnt11 = 0;
int p[n];
for(int i = 0;i<n;i++){
if(a[i] == 0 and b[i] == 0){
cnt00++;
}else if(a[i] == 0 and b[i] == 1){
cnt01++;
}else if(a[i] == 1 and b[i] == 0){
cnt10++;
}else{
cnt11++;
}
}
if(cnt10 == 0){
cout<<-1<<endl;
}else{
int p = cnt01/cnt10;
p++;
cout<<p<<endl;
}
return 0;
}