1.经此一役小红所向无敌
默认小红血量无限。直接计算出经过几轮攻击后,会出现人员伤亡。
对于对立来说他最多承受n轮光的攻击,对于光来说,他最多承受立得m轮攻击。
所以在经过min(n,m)轮回合之后,他们两个人至少死一个。活下来的人就自杀。
代码:
#include <iostream> using namespace std; typedef long long LL; int main() { LL a,h,b,k; cin>>a>>h>>b>>k; LL cnt1=(h-1+b)/b; LL cnt2=(k-1+a)/a; LL cnt=min(cnt1,cnt2); LL ans=cnt*(a+b); // cout<<cnt1<<" "<<cnt2<<endl; if(cnt1==cnt2){ cout<<ans<<endl; return 0; }else if(cnt1>cnt2){ ans+=a*10; }else{ ans+=b*10; } cout<<ans<<endl; return 0; }
2.连续子数组得最大和
遇到这种连续得区间题目,要么枚举左右端点,要么就是枚举右端点。
枚举每一个区间的右端点,f[i]表示以第i个元素结尾的区间的最大和是多少。
所以f[i]=max(f[i-1]+a[i],a[i])
哦对了这是一个sb题目,数组开1e5居然过不了。得开1e6。
代码:
#include <iostream> #include<algorithm> using namespace std; const int N=1e6+100; long long f[N]; int main() { int n; cin>>n; long long ans=-1e16; for(int i=1;i<=n;i++){ cin>>f[i]; f[i]=max(f[i-1]+f[i],f[i]); ans=max(f[i],ans); } cout<<ans<<endl; return 0; } // 64 位输出请用 printf("%lld")
3.非对称之美
思考这样一个事实:如果下标[l,r]是一个回文串,那么[l+1,r]一定不是回文串,除非里面元素全部相等。自己去推一下就好了。
代码:
#include <iostream> #include<string> using namespace std; int main() { string str; cin>>str; if(str.size()<=1){ cout<<0<<endl; return 0; } int l=0; int r=str.size()-1; while(l<r){ if(str[l]==str[r]){ l++; r--; }else{ cout<<str.size()<<endl; return 0; } } l=1; r=str.size()-1; while(l<r){ if(str[l]==str[r]){ l++; r--; }else{ cout<<str.size()-1<<endl; return 0; } } cout<<0<<endl; return 0; }