A题
输入两个长度为n的数组a,b,(其中第i项是1的话代表有,0代表没有, 要求a比b数组大,对于每一项都有对应的价值pi, 尽可能控制每一项最小)
输出 要求出使得a数组比b大的pi中的最大项
思路:相同情况的就抵消掉(不许考虑),只需要考虑1.b有,a没有;2. a有,b没有,两种情况,对于所有1情况都将对应的pi设置为1,计算总和,然后平分在情况2中
1 #include <iostream> 2 #include <bits/stdc++.h> 3 4 using namespace std; 5 typedef long long ll; 6 typedef pair<int,int>PII; 7 const int N = 1e5+10; 8 const ll mod = 1e9+7; 9 int a[110],b[110]; 10 int main() 11 { 12 int n; 13 cin >> n; 14 ll num =0,cun=0; 15 for(int i=1;i<=n;i++) 16 { 17 cin>> a[i]; 18 } 19 for(int i=1;i<=n;i++) 20 { 21 cin>> b[i]; 22 } 23 for(int i=1;i<=n;i++) 24 { 25 if(b[i]==1&&a[i]==1)continue; 26 else if(a[i]==1&&b[i]==0)num++; 27 else if(a[i]==0&&b[i]==1)cun++; 28 } 29 if(num==0) 30 { 31 cout << -1<<endl; 32 } 33 else 34 cout << cun/num +1<<endl; 35 return 0; 36 }
B题
输入长度为n的一组数组
输出符合条件的最大和
条件是要求 对于满足 ( aj - ai = j- i )一组数(对于这一组数任意两项瞒足,这个条件)的和,求最大和
重点分析一下哈aj-ai = j- i,合并一下同类项 aj - j = ai - i;因此可以将这个数组所有的情况都计算一遍
1 B 2 //a[i] - a[j] = i -j;----> a[i]-i=a[j]-j 3 //这里为了保证a[i]-i>=0;就对n取模 4 #include <bits/stdc++.h> 5 6 using namespace std; 7 typedef long long ll; 8 const int N = 2e5+10; 9 const int M = 1e6+10; 10 int a[N]; 11 ll tg[M]; 12 int main() 13 { 14 int n; 15 cin >> n; 16 for(int i=1;i<=n;i++) 17 { 18 cin >> a[i]; 19 tg[a[i]-i+n]+=a[i]; 20 } 21 ll ma =0; 22 for(int i=0;i<=M;i++) 23 ma =max(ma,tg[i]); 24 cout << ma <<endl; 25 }
原文地址:https://www.cnblogs.com/wsxmmfby-jy/p/12400786.html
时间: 2024-10-10 05:37:11