A.有加才减
代码语言:javascript复制//A
#include <bits/stdc .h>
using namespace std;
int main()
{
int n;
string s;
cin>>n;
cin>>s;
int ad = 0,sub = 0;
for(int i=0;i<s.size();i ){
if(s[i]==' '){
ad ;
}else {
if(ad>0){
ad--;
}
}
}
printf("%dn",ad);
return 0;
}
B.
代码语言:javascript复制//B
#include <bits/stdc .h>
using namespace std;
int mi = 1e9 1;
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i ){
int t;
scanf("%d",&t);
mi = min(mi, t/max(i-1,n-i));
}
printf("%dn",mi);
return 0;
}
C.
n个男生给m个女生每人都送糖果,
接下来n个数a1~an是男生送出的最小数量,然后是m个 b1~bm 是女生收到的最大数量。
问最少多少糖果。
解:
先假设男生送给女生每个人都是最小的,则ans = sum(a1~an)*m.
再补偿差距 = bj - ai. 补偿尽可能少,bj是不变的,ai就尽可能大。将n个数排序,从最大的a1开始每个可以补偿m-1次。
因为要保证本身最小为ai。
若有bj<amax,则输出-1
代码语言:javascript复制//559 C
#include <bits/stdc .h>
using namespace std;
#define ll long long
const int N = 1000005;
ll n,m;
ll a[N],b[N];
int cmp(int c,int d){
return c>d;
}
int main()
{
ll ans = 0;
ll sum = 0;
int flag = 0;
cin>>n>>m;
for(int i=0;i<n;i ){
cin>>a[i];
sum =a[i];
}
ans = sum*m;
sort(a,a n,cmp);
int j = 0;
int count = m-1;
for(int i =0;i<m;i ){
cin>>b[i];
if(b[i]>a[0]){
ans =b[i]-a[j];
count--;
if(count==0){
j ;
count = m-1;
}
}else if(b[i]<a[0]){
flag = 1;
}
}
if(flag)printf("-1n");
else printf("%I64dn",ans);
return 0;
}