CSP认证-第二次培训(2019.9.5)

A题 最小差值

在这里插入图片描述在这里插入图片描述
100分 AC代码:

#include <bits/stdc++.h>
using namespace std;
int n,mi,tmp,a[1010];
int main()
{
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    mi=0x3f3f3f3f;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(j==i)continue;
            tmp=abs(a[i]-a[j]);
            mi=min(mi,tmp);
        }
    printf("%d\n",mi);
    return 0;
}

B题 游戏

在这里插入图片描述
在这里插入图片描述
约瑟夫游戏,队列模拟即可。

100分 AC代码:

#include <bits/stdc++.h>
using namespace std;
queue<int>q;
int n,tmp,cnt,k;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        q.push(i);
    while(q.size()>1)
    {
        cnt++;
        tmp=q.front();
        q.pop();
        if(!(cnt%10==k||cnt%k==0))q.push(tmp);
    }
    printf("%d\n",q.front());
    return 0;
}

C题 分蛋糕

在这里插入图片描述
100分 AC代码:

#include <bits/stdc++.h>
using namespace std;
int n,k,tmp,ans,rest,a[1010];
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        tmp=tmp+a[i];
        rest=k-tmp;
        if(tmp>=k){ans++;tmp=0;}
    }
    if(rest>0)ans++;
    printf("%d\n",ans);
    return 0;
}

D题 学生排队

在这里插入图片描述
在这里插入图片描述
维护一个链表即可。
每次移动一个节点相当于链表的两个基本操作:删除节点,再将其插入。
时间复杂度为O(n*m)。

100分 AC代码:

#include <bits/stdc++.h>
using namespace std;
int n,m,x,d,num;
struct node
{
    int data;
    struct node *next;
}*H,*p,*tail;
int delete_x(int x)//删除x,并返回x的原位置
{
    p=H;
    for(int i=1;i<=n;i++)
    {
        if(p->next->data==x)
        {
            p->next=p->next->next;
            return i;
        }
        p=p->next;
    }
}
void insert_x(int i,int x)//删除x之后,将x插入到第i个位置(传入i时注意:在删除x后位置发生了改变)
{
    p=H;
    for(int j=1;j<i;j++)
        p=p->next;
    node *newp;
    newp=new node;
    newp->data=x;
    newp->next=p->next;
    p->next=newp;
}
void output()//打印输出
{
    p=H->next;
    for(int i=1;i<n;i++)
    {
        printf("%d ",p->data);
        p=p->next;
    }
    printf("%d\n",p->data);
}
int main()
{
    H=new node;
    H->next=NULL;
    cin>>n>>m;
    tail=H;
    for(int i=1;i<=n;i++)//建立链表
    {
        tail->next=new node;
        tail=tail->next;
        tail->data=i;
        tail->next=NULL;
    }
    while(m--)
    {
        cin>>x>>d;
        if(d==0)continue;//没有移动
        num=delete_x(x);
        if(d>0)num=num+d;
        else num=num+d;
        insert_x(num,x);
    }
    output();
    return 0;
}
发布了72 篇原创文章 · 获赞 91 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/ljw_study_in_CSDN/article/details/100565075