1.小易的升级之路
跟着题目一路模拟就行,注意longlong
代码:
#include <iostream> using namespace std; typedef long long LL; LL gcd(LL a,LL b){ return b==0?a:gcd(b,a%b); } int main() { int n; LL x; cin>>n>>x; LL a; for(int i=0;i<n;i++){ cin>>a; if(x>=a){ x+=a; }else{ x=x+gcd(x,a); } } cout<<x<<endl; }
2.礼物的最大价值
代码:
class Solution { public: int maxValue(vector<vector<int> >& grid) { int n=grid.size(); int m=grid[0].size(); vector<vector<int>> dp(n+1,vector<int>(m+1)); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ dp[i][j]=max(dp[i-1][j]+grid[i-1][j-1],dp[i][j-1]+grid[i-1][j-1]); } } return dp[n][m]; } };
3.对称之美
想一下我们是怎么判断一个字符串是不是回文字符串的。从两边到中间不断的看是不是相同字符。
同样的,我们也可以从n个字符串中,从两边到中间看,有没有相同的字符。
用双指针l和r分别指向第一个字符串和最后一个字符串。只需要判断这俩字符串有没有相同的元素,如果没有,说明一定不能构成回文串。有则l++,r--继续找相同。直到l>=r结束。
快速判断俩字符串有没有相同元素,可以用位运算。或者用一个map遍历也可以。
代码:
#include <iostream> #include<cstring> using namespace std; const int N=110; int a[N]; int main() { int t; cin>>t; while(t--){ memset(a,0,sizeof a); int n; cin>>n; string str=""; for(int i=0;i<n;i++){ cin>>str; for(int j=0;j<str.size();j++){ int u=str[j]-'a'; a[i]|=(1<<u); } } int l=0,r=n-1; int f=0; while(l<r){ if((a[l]&a[r])!=0){ l++; r--; }else{ f=1; break; } } if(!f){ cout<<"Yes"<<endl; }else cout<<"No"<<endl; } }