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;
}