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; }