A. Mezo Playing Zoma
题意:有“L”和“R”指令,L表示向左移动一位,R则向右移动一位,但有时指令会出现故障,导致该命令没有执行,就在原地不动,问最大的可能移动区间为多少。
解:统计L和R的个数。ans=L+R+1;
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; char a[MAXN]; int main(){ int n; cin>>n; cin>>a; int r=0; int l=0; for(int i=0;i<n;i++){ if(a[i]=='R')r++; else if(a[i]=='L')l++; } cout<<l+r+1<<endl; return 0; }
B. Just Eat It!
题意:有两个人去到shop买东西,有n个东西,A会把所有东西都买一遍,而B就会选择一个区间购买(该区间不能跟全集相同),问A的购买价值是否严格大于B。
解:第一想法:对于B求最大子段和,然后和A比较。
因为不能选择全集,所以就应该分成两部分来求最大子段和,
(1,n-1)和(2,n)来求最大字段和,这样就不会选择全集了。
dp[i]=max(dp[i-1],0)+a[i]
#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; typedef long long ll; ll a[MAXN],n; ll gao(int l,int r){ ll pre[MAXN]; pre[0]=pre[1]=0LL; ll res=0; for(int i=l;i<=r;i++){ pre[i]=max(pre[i-1],0LL)+a[i]; res=max(pre[i],res); } return res; } int main(){ int T; cin>>T; while(T--){ cin>>n; ll sum=0LL; for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i]; ll res=max(gao(1,n-1),gao(2,n)); if(res>=sum)cout<<"NO"<<endl; else cout<<"YES"<<endl; } return 0; }
C. Fadi and LCM
题意:给一个x,求 最小的 max(a,b)满足lcm(a,b)==x。
解:因为a,b的lcm是x,所以a,b一定是x的因子,所以把x暴力分解了。
然后把因子拿出来再求一遍lcm,是x就是答案了~
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; ll x; vector<ll>vec; int main(){ cin>>x; for(int i=1;i<=sqrt(x);i++){ if(x%i==0){ vec.push_back(x/i); } } sort(vec.begin(),vec.end()); for(int i=0;i<vec.size();i++){ ll a=x/vec[i]; ll b=vec[i]; if(a/__gcd(a,b)*b==x){ cout<<a<<' '<<b<<endl; return 0; } } return 0; }
D. Dr. Evil Underscores
题意:求一个数X于数组中的每个元素异或后的最大值最小,求最大值。
解:首先要知道异或运算是一个二进制加法不进位的运算。
1^1=0 0^0=0 1^0=1 0^1=1
从高位开始求,假设当前是第k位:
1.数组中的每个数都是0或者是1,那么答案中的第k位一定是0,因为我们选择x的第k位跟数组中的第k位一样就可以获得异或后答案第k位是0.
2.数组中的每个数有1又有0,那么答案位一定是1,不管你x的第k位取得什么样的值,异或后的结果都是1。然后取最小的值对于剩下的k-1位。
看一些dalao的题解:字典树贪心好像差不多都一样
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; ll gao(vector<int> &vec,int now){ if(now<0 || vec.size()==0){ return 0; } vector<int>p,q; for(int i=0;i<vec.size();i++){ if((vec[i]>>now)&1){ p.push_back(vec[i]); } else{ q.push_back(vec[i]); } } if(p.size()==0)return gao(q,now-1); if(q.size()==0)return gao(p,now-1); return (1LL<<now)+min(gao(q,now-1),gao(p,now-1)); } int main(){ int n; cin>>n; vector<int>vec; for(int i=1;i<=n;i++){ int x; cin>>x; vec.push_back(x); } cout<<gao(vec,30)<<endl; return 0; }