day6下

来源:互联网 发布:centos软件包管理器 编辑:程序博客网 时间:2024/05/16 00:25

t1
函数最值
【问题描述】
给定一个 n 个数的数组 A,函数 F(x) = a[i]*x 的第 i 个二进制位。求 F 的最大值 x 为整数且
0<=x<=m.

对每一位处理,如果可以,就选或不选,不选之后的都可以选,选了再继续这个过程

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;long long n,m,t,ans,a[119999],s[110000],c[110000],sum;char b[110000];int main(){    freopen("maximum.in","r",stdin);    freopen("maximum.out","w",stdout);    scanf("%lld",&n);    for(int i=1;i<=n;i++) scanf("%lld",&a[i]);cin>>b+1;    for(int i=1;i<=n;i++) c[i]=b[i]-'0',s[i]=s[i-1]+((a[i]>0)?a[i]:0);     for(int i=n;i>=1;i--){        if(c[i]){            ans=max(ans,sum+s[i-1]);            if(a[i]<=0)     break;            sum+=a[i];         }    }    printf("%lld",max(ans,sum)); }

t2
函数最值 2
【问题描述】
对于一个数组 A 定义 F(A) = max abs(a[i] – a[i+1]); 给定一个数组,最多修改其中 k 个元素,
求 F(A)的最小值
二分答案,dp判断可不可以

if(abs(a[i]a[j])<=((longlong)x(ij)))f[i]=min(f[i],f[j]+(ij1));

只有小于他才能改,大于他不能改,应该说怎么改都不可能满足

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>using namespace std;int n,k;int a[2000],f[2000];int ok(int x){   f[1] = 0;   int ans = n;   for (int i = 2; i<=n;i++)   {     f[i] = i-1;     for (int j = 1; j<i;j++)     if (abs(a[i]-a[j])<=((long long)x*(i-j))) f[i] = min(f[i],f[j]+(i-j-1));     ans = min(ans,f[i]+n-i);   }   return ans<=k;}int main(){  freopen("minimum.in","r",stdin);  freopen("minimum.out","w",stdout);  scanf("%d%d",&n,&k);  for (int i = 1; i<=n;i++)    scanf("%d",&a[i]);  int l = 0, r = 1000000001; while (l<=r)  {     int mid=(l+r)>>1;     if (ok(mid)) r=mid-1; else l=mid+1;  }    printf("%d\n",l);  return 0;}