完全数
解题思路
签到?
正常统计因子和就行,大了就直接跳,时间复杂度为根号级别,莫得问题。
AC代码
#include<bits/stdc++.h> #define ll long long using namespace std; int f; ll n,ans=1; int main() { cin>>n; for(int i=2;i<=sqrt(n);i++)//从2开始 { if(n%i==0) ans+=i+n/i; if(ans>n){f=1;break;}//因子和大于n直接break就行 } if(f==0) { if(ans==n) puts("Pure"); else puts("Early"); } else puts("Late"); }
移动撤销
解题思路
栈;
用栈实现,栈中元素为坐标;
遇到z就弹出,其他的就压入,注意特判一下如果栈中只有原点了,没法进行pop操作,直接continue就行。
AC代码
#include<bits/stdc++.h> #define ll long long #define fi first #define se second using namespace std; typedef pair<int,int> pii; stack<pii> s; string str; int n; int main() { cin>>n>>str; str='.'+str; s.push(pii(0,0)); for(int i=1;i<=n;i++) { if(str[i]!='Z') { int x=s.top().fi,y=s.top().se; if(str[i]=='W') s.push(pii(x,y+1)); else if(str[i]=='A') s.push(pii(x-1,y)); else if(str[i]=='S') s.push(pii(x,y-1)); else s.push(pii(x+1,y)); } else { if(s.size()==1) continue; else s.pop(); } } cout<<s.top().fi<<' '<<s.top().se<<endl; }
石头剪刀布
解题思路
贪心;做过两次类似的了,所以这次直接秒掉。
贪心策略:能赢就别平,能平就别输。
介绍一下变量,m开头代表man,即公牛,即牛牛;w开头代表woman,即母牛,即牛妹,ok,这样你就好理解代码了,至于a,b,c就是石头剪刀布,顺序无所谓。
详见代码写的比较简单,几个min搞定了,可能不是很好理解
AC代码
#include<bits/stdc++.h> #define ll long long using namespace std; int ans,ma,mb,mc,wa,wb,wc,n; int main() { cin>>n>>ma>>mb>>mc>>wa>>wb>>wc; int a=min(ma,wb);ans+=(a<<1);ma-=a;wb-=a;//牛牛石头数和牛妹剪刀数较小数目为a int b=min(mb,wc);ans+=(b<<1);mb-=b;wc-=b;//牛牛剪刀数和牛妹布数较小数目为b int c=min(mc,wa);ans+=(c<<1);mc-=c;wa-=c;//牛牛布数和牛妹石头数较小数目为c ans+=min(ma,wa)+min(mb,wb)+min(mc,wc);//牛牛剩下的石头和牛妹剩下的石头数目中较小数目为平局数目,同理对于剪刀和布 cout<<ans<<endl; }
夹缝中求和
解题思路
从小到大排序,每次统计i点之后比a[i]大的点的个数;
为什么这样是正确的?
假如两个数的大小分别为a,b且x<=a+b<=y,无论a与b在序列中的相对位置是什么样的,这对成立的数都只会被统计一次;
假设a在b的左边,即排完序后a位置小于b位置,即a的值小于等于b的值,那a和b这对成立的情况只会在遍历到a的时候被统计一次,而遍历到b的时候,只会统计比b的右侧的数中比b大的数,不会重复统计与a配对成功的情况;同样的,b在a左边也是类似的。
AC代码
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+10; int a[N],n,x,y; ll ans;//开ll int main() { cin>>n>>x>>y; for(int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); for(int i=1;i<n;i++) { ll lb=lower_bound(a+i+1,a+n+1,x-a[i])-a,ub=upper_bound(a+i+1,a+n+1,y-a[i])-a; ans+=max(0LL,ub-lb); } cout<<ans<<endl; }
个人总结
没AK,FW一枚!
最后一题的大致想法对了,但是最最最灵魂的地方还是没想到,一直TLE;
我就是FW啊!!!CF做少了,继续肝。虽然要到myq大佬的答案了,但是我没有写上哦,未作弊,莫举报
myq yyds!
专门给大佬来一下