【笔试训练】day22

1.添加字符

求最少不相等的位数,可以先求最多相等的位数。

在添加字符之前,A和B最多相等的位数是多少?由于A后面可以添加字符,也就使得A字符可以在B的任意一个位置开始比较。遍历一遍这个比较的起点,从这个起点开始跟A比较,看有多少相等的。用一个变量维护这个添加字符前最多相等的数量。

添加字符后呢?由于是可以添加任何字符,我们默认添加多少,就有多少个相等,即两个字符的长度差。

代码:

#include <iostream>
#include<vector>
#include<string>
using namespace std;

int main(){
   string a;
   string b;
   cin>>a>>b;
   int n1=a.size();
   int n2=b.size();
 
    int ans=0;
   for(int i=1;i+n1-1<=n2;i++){
    int pos=i;
    int cnt=0;
    for(int j=1;j<=n1;j++,pos++){
        if(a[j-1]==b[pos-1]){
           cnt++;
        }
    }
    ans=max(ans,cnt);
   }
   cout<<n2-(n2-n1+ans)<<endl;
    return 0;
}

2.数组变换

排个序,遍历一遍数组,看当前元素的前一个元素是否能通过不断乘2来等于它。如果不能就直接NO

代码:

#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;

typedef long long LL;

bool isfun(LL x,LL y){
    if(x==y)return true;
    int p=2;
    while(x<y){
        x=x*p;
    }
    if(x==y)return true;
    return false;
}
int main() {
    int n;
    cin>>n;
    vector<int> a(n);
    for(int i=0;i<n;i++){
        cin>>a[i];
    }

    sort(a.begin(),a.end());
    int f=0;
    for(int i=1;i<n;i++){
       if(!isfun(a[i-1],a[i])){
           f=1;
           break;
       }
    }
    if(f)cout<<"NO"<<endl;
    else cout<<"YES"<<endl;
    return 0;
}

3.装箱问题

最小剩余空间,即v-最大利用空间。

01背包,只不过最大价值变成了最大利用空间。换一下值而已。

代码:

#include <iostream>
#include<vector>
using namespace std;
int main() {
    int v;
    int n;
    cin>>v>>n;
    vector<int> a(n+1);
    vector<vector<int>> f(n+1,vector<int>(v+1));
    for(int i=1;i<=n;i++)cin>>a[i];

    for(int i=1;i<=n;i++){
        for(int j=0;j<=v;j++){
             if(j>=a[i])f[i][j]=max(f[i-1][j-a[i]]+a[i],f[i-1][j]);
             else f[i][j]=f[i-1][j];
        }
    }
    cout<<v-f[n][v];
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值