1.字符串替换(一)
双指针维护一个相同字符的区间。注意个数可能是一个两位数,得用tostring.
代码:
class Solution { public: string compressString(string param) { int n=param.size(); if(n<=1)return param; string ans=""; int i,j; for( i=1,j=0;i<n;i++){ if(param[i]!=param[i-1]){ ans+=param[j]; if(i-j>1){ ans+=to_string(i-j); } j=i; } } ans+=param[j]; if(n-j>1){ ans+=to_string(n-j); } return ans; } };
2.chike和蜜柑
贪心排序。优先把甜度高的排在前面,甜度一样就优先酸度低的。
代码:
#include <iostream> #include<algorithm> using namespace std; const int N=2e5+10; struct orange{ int t; int s; }o[N]; bool cmp(orange &a,orange &b){ if(a.t==b.t)return a.s<b.s; return a.t>b.t; } int main() { int n,k; cin>>n>>k; for(int i=0;i<n;i++){ cin>>o[i].s; } for(int i=0;i<n;i++)cin>>o[i].t; sort(o,o+n,cmp); long long ans1=0,ans2=0; for(int i=0;i<k;i++){ ans1+=o[i].t; ans2+=o[i].s; //cout<<o[i].s<<"--- "<<o[i].t; } cout<<ans2<<" "<<ans1<<endl; }
3.01背包
dp[j]表示背包容量为i时能最多存放多少重量。
拿还是不拿,拿的话就dp[j-vw[i][0]]+vw[i-1][1],不拿就dp[j](i-1时)。
逆序遍历体积。为什么逆序遍历呢。因为j-vw[i-1][0]一定小于j,不会影响到以及遍历过的dp[j]
代码:
class Solution { public: int knapsack(int V, int n, vector<vector<int> >& vw) { vector<int> dp(V+1); for(int i=1;i<=n;i++){ for(int j=V;j>=vw[i-1][0];j--){ dp[j]=max(dp[j-vw[i-1][0]]+vw[i-1][1],dp[j]); } } return dp[V]; } };