题目
给定两个长度为 的 数组 和 。
请你构造一个长度为 的正整数数组 。
要求 成立。
此外, 需要尽可能小。
输出最小可能值。
思路
对于每一位对位一共有四种情况,分别是<0,0>,<1,0>,<0,1>,<1,1>两两组合,其中<0,0>和<1,1>是没有意义的,因为他们对于任何一个对于求和都是相等的,所以我们考虑01,与10。
统计01和10个数,分别为cnt1和cnt2,有下面几种情况:
1)cnt1=0 这个时候无论如何不等式都不会满足,输出-1
2)cnt1<cnt2(cnt1>0) 这个时候为了使其最小,那么对于任何的01组合pi都为1,那么就要想尽办法让10追上01,这时候平均分下去,还得+1,毕竟不能相等
3)cnt1=cnt2 这个时候只需要给其中一个10组合pi=2即可
4)cnt1>cnt2 那么pi全部为1即可
代码
#include<stack>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<cstring>
#include<deque>
#include<vector>
#include<iostream>
#include<map>
#include<set>
#include<iomanip>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define ll long long
using namespace std;
ll GCD(ll a,ll b){while(b^=a^=b^=a%=b);return a;}
const int inf=0x3f3f3f3f;
int a[110],b[110],cnt1,cnt2,n;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("IO\\in.txt","r",stdin);
freopen("IO\\out.txt","w",stdout);
#endif
IOS
cin>>n;
for (int i=1;i<=n;i++) cin>>a[i];
for (int i=1;i<=n;i++) cin>>b[i];
for (int i=1;i<=n;i++)
{
if (a[i]==1&&b[i]==0) cnt1++;
if (a[i]==0&&b[i]==1) cnt2++;
}
if (cnt1==0) cout<<-1;
else if (cnt1==cnt2) cout<<2;
else if (cnt1>cnt2) cout<<1;
else cout<<cnt2/cnt1+1;
return 0;
}