牛客IOI周赛20-普及组 题解

完全数

解题思路

签到?
正常统计因子和就行,大了就直接跳,时间复杂度为根号级别,莫得问题。

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!

专门给大佬来一下

全部评论

相关推荐

个人背景:学院二本计科专业&nbsp;大二开始实习个人经历:安克创新&nbsp;、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps:&nbsp;很多人会问我学习路线和经验&nbsp;但是就像我上面说的&nbsp;我的实习过程靠的很多是关键节点的运气&nbsp;技术上面我可能不如很多人&nbsp;&nbsp;所以请大家理性求助和理性参考我的回答&nbsp;附上我的投递记录
我的offer在哪里...:从去年看到现在,飞升哥就是榜样
我的求职进度条
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务