2020年2月15日 考试【更新中】

2020年2月15日 考试

又是一次不成功的考试,在很小的地方屡次摔跤,摔到心态失衡,这次考试就很难再翻身了。再被抬了两手的情况下才勉强AC了两道水题,而错误的原因却是最细微的地方没有考虑到。最后才自己写出来一道题。以后一定要在考试的时候冷静下来,慎重考虑后再继续前进。

Problem A / 林大OJ 1295 机器人

这次考试中唯一一道自己写出来的题,想来也是充满讽刺,没有努力和思考什么时候才能勉强跟的上别人的脚步?
这道题我的方法是结构体排序法,把数字的原形与翻转后的存到结构体中,按照翻转后的排序,按顺序输出原型,难度不大,被炸裂的心态冲昏了头。

#include <bits/stdc++.h>

using namespace std;

struct node
{
    int x,y;
}p[26];

int f(int x)
{
    int y=0;
    while(x!=0){
        y=y*10+x%10;
        x/=10;
    }
    return y;
}

bool cmp(const struct node &m,const struct node &n)
{
    return m.y<n.y;
}

int main()
{
    int n;
    while(cin>>n){
        for(int i=0;i<n;i++){
            cin>>p[i].x;
            p[i].y=f(p[i].x);
        }
        sort(p,p+n,cmp);
        for(int i=0;i<n-1;i++)
            printf("%d ",p[i].x);
        printf("%d\n",p[n-1].x);
    }
    return 0;
}

Problem B / 林大OJ 1311 纸牌游戏

被抬了一手之后思考修改了很长时间才做出来。
之前错误的原因是自认为只要在最后加一个q.pop()就能清空队列,但这样在数据很多的时候是无法清空的,还有一个原因是错误理解了没有扔掉牌时只输出剩下牌的意义,在n=1时只输出1就足够了,真是令人头大的题,也反映出来个人观察的不细致。

#include <bits/stdc++.h>

using namespace std;

queue<int>q;
int a[51],cnt=0,t1,t0;

int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        while(!q.empty())
            q.pop();
        for(int i=1; i<=n; i++)
            q.push(i);
        cnt=0;
        if(n==1)
            printf("1\n");
        else
        {
            while(q.size()>1)
            {
                a[++cnt]=q.front();
                q.pop();
                t1=q.front();
                q.pop();
                q.push(t1);
            }
            for(int i=1; i<cnt; i++)
                cout<<a[i]<<",";
            cout<<a[cnt]<<endl;
            cout<<q.front()<<endl;
        }
    }
    return 0;
}

Problem C / 林大OJ 2114 咸鱼连突刺

题意已经看懂了,却陷入了WA的困境,应该特殊考虑的情况太多,也没有考虑,写出来的代码也没有很好地反映自己心中的想法,总是在各种地方出现错误,最终在水题上选择了放弃。
真的是很可惜,看到题解才发现这道题有多简单,为数不多的暴力解题法就能做出来的题却没能抓住,本来可以再多考虑几次的。
以下是题解:
素数筛把所有的素数筛选出来,然后对于每次询问,
L 到 R跑一次找最小值,R到L跑一次找最大值
找不到就说明这一次不存在符合条件的素数
然后加和
还需要注意的就是结果可能爆int,所以sum用long long接收。

#include <bits/stdc++.h>

using namespace std;

const int N=1e6;
int n,cnt,prime[N+10];
bool b[N+10];
void get_prime()
{
    memset(b,1,sizeof(b));
    b[0]=b[1]=0;
    for(int i=2;i<=N;i++){
        if(b[i])
            prime[++cnt]=i;
        for(int j=1;j<=cnt && i*prime[j]<=N;j++){
            b[i*prime[j]]=0;
            if(i%prime[j]==0) break;
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    get_prime();
    int T;
    long long sum=0;
    cin>>T;
    while(T--){
        int L,R,flag1=0,flag2=0;
        cin>>L>>R;
        int a1=0,a2=0;
        for(int i=L;i<=R;i++){
            if(b[i]){
                flag1=1;a1=i;break;
            }
        }
        for(int i=R;i>=L;i--){
            if(b[i]){
                flag2=1;a2=i;break;
            }
        }
        if(flag1&&flag2)
            sum+=a1+a2;
    }
    cout<<sum<<endl;
    return 0;
}

Problem D / 林大OJ 2110 库特的合并果子

本来这道题昨天已经做过了,就是把总的输出改成每天的输出,却卡了半天,11次提交。
这道题多的坑点:数据范围变成long long,要在队列定义里改成long long(这个原因看起来简单,却是一开始无限RE的原因)。
很可惜在这道题上耗费了很多时间,这也是我心态爆炸的起源,以后一定要细心,细心。

#include <bits/stdc++.h>

using namespace std;

priority_queue<long long,vector<long long>,greater<long long> >q;

int main()
{
    ios::sync_with_stdio(false);
    long long n,t1,t2,x;
    while(cin>>n)
    {
        for(int i=1; i<=n; i++)
        {
            cin>>x;
            q.push(x);
        }
        while(q.size()>1)
        {
            t1=q.top();q.pop();
            t2=q.top();q.pop();
            q.push(t1+t2);
            q.size()==1?printf("%lld\n",t1+t2):printf("%lld ",t1+t2);
        }
        q.pop();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值