2021CSP-J2普及级第二轮比赛(复赛)试题参考资料v1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/* T1 分糖果:友好的题目
思路:分两种情况
1. L~R中没有能整除n的数,那么结果R%n
2. L~R中可以整除n,结果n-1
*/
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,l,r;
cin>>n>>l>>r;
if(r/n == l/n)
cout<<r%n<<endl;
else
cout<<n-1<<endl;
return 0;
}
/*
T2 插入排序
思路:
1. 暴力会超时,可以拿部分分。

2. 用b数组用来记录第i个数排序后的位置并在更改数据(操作一)后维护b数组,使b数组依然适用。

*/
#include <bits/stdc++.h>
using namespace std;
const int maxn=8010;
struct node{
int id,num;
}a[maxn];
int n,q,b[maxn];
void change(int pos)
{
while(pos>1) //向前找
{
if(a[pos].num > a[pos-1].num) break;
if(a[pos].num == a[pos-1].num and a[pos].id > a[pos-1].id ) break;
swap(a[pos],a[pos-1]);
b[a[pos].id]=pos;
pos--;
}
while(pos<n) //向后找
{
if(a[pos].num < a[pos+1].num) break;
if(a[pos].num == a[pos+1].num and a[pos].id < a[pos+1].id ) break;
swap(a[pos],a[pos+1]);
b[a[pos].id]=pos;
pos++;
}
b[a[pos].id]=pos;
}
bool cmp(node x,node y)
{
if(x.num == y.num)
return x.id<y.id;
else
return x.num < y.num;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].num);
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) //排序后索引对应关系{
b[a[i].id]=i;
}
while(q--)
{
int k,x,v;
scanf("%d",&k);
if(k==1){ //修改
scanf("%d%d",&x,&v) ;
a[b[x]].num=v;
change(b[x]);
}else{
scanf("%d",&x);
printf("%d\n",b[x]);
}
}
return 0;
}
/* T3 网络连接:字符串处理
思路:
1. 利用函数:sscanf、sprintf
2. 分类讨论各种情况
*/
//检查IP
#include <bits/stdc++.h>
using namespace std;
bool check(string ip)
{
int t[6]={0,-1,-1,-1,-1,-1} ;
int cnt=sscanf(ip.c_str(),"%d.%d.%d.%d:%d",&t[1],&t[2],&t[3],&t[4],&t[5]);
if(cnt !=5)
return false;
for(int i=1;i<=4;i++)
{
if(t[i]<0 || t[i]>255)
return false;
}
if(t[5]<0 || t[5]>65535)
return false;
char tmp[30]="\0";
sprintf(tmp,"%d.%d.%d.%d:%d",t[1],t[2],t[3],t[4],t[5]) ;
if((string)tmp != ip)
return false;
return true;
}
map<string ,int>server;
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
string s,t;
cin>>s>>t;
if(!check(t)){
cout<<"ERR"<<endl;
continue;
}
if(s=="Server")//服务器端
{
if(server[t] !=0 )
{
cout<<"FAIL"<<endl;
continue;
}else{
server[t]=i;
cout<<"OK"<<endl;
continue;
}
}else{ //客户端
if(server[t]!=0)
{
cout<<server[t]<<endl;
}else{
cout<<"FAIL"<<endl;
}
}
}
return 0;
}
/* T4 小熊的果篮
思路:数组模拟链表
*/
#include<bits/stdc++.h>
using namespace std;
const int N=200010;
int a[N],L[N],R[N];
int main(){
int n;
scanf("%d",&n);
vector<int>b;
for(int i=1;i<=n;i++)//初始化双链表存储每个块的头元素位置
{
scanf("%d",&a[i]);
if(i==1||a[i]!=a[i-1])
b.push_back(i);
L[i]=i-1;
R[i]=i+1;
}
R[0]=1,L[n+1]=n;
a[0]=a[n+1]=-1;
while(R[0]!=n+1)//当双链表不空
{
vector<int>c;
for(auto u:b)
{
printf("%d ",u);//输出每个块的头结点
int x=L[u],y=R[u]; //删除已输出的节点u
R[x]=y,L[y]=x;
if(a[u]==a[y]&&a[u]!=a[x])c.push_back(y);//u和左元素不同且和右元素相同则是块的起点就存下来
}
puts("");
swap(b,c);
}
return 0;
}。

相关文档
最新文档