CSP - J 2021 题目解析
diary
1、马上就要月考了,期末考也近在眼前,心中慌成DOG,却还在游手好闲,是时候调整一下了
2、总结出了学习规律
要尊重他人,想说的话要用纸条来传达
在从别人那里获取了利益之前,要先展示出你的价值
Next,让我们进入今天的正题
CSP - J - 1 分糖果
刚开始一看,感觉很简单,然后就想了好久。。。。
题意简述:
给你三个数 \(n,l,r\),让你在 \([l,r]\) 中找到一个整数 \(x\),使 \(n\) \(mod\) \(x\) 最大,输出这个最大的 \(n\) \(mod\) \(x\)
这题可以用多个方面去分析
我们当然选择最简单的
可以知道
①若 \(l\)和\(r\)之间的长度\((r-l+1) ≥ n\),就一定有一个\(x\)使得 \(n\) \(mod\) \(x=n-1\) (不会的可以手动模拟一下)
②若 \(l\)和\(r\)之间的长度\((r-l+1) < n\) 再次进行分类讨论
⑴\(l\) \(mod\) \(n\) \(≤\) \(r\) \(mod\) \(n\) (注意是小于等于,因为当l==r也合适这个图)
如图
此时能取到的数的范围为上图的红色部分,这时答案为 \(r\) \(mod\) \(n\)
⑵\(l\) \(mod\) \(n\) \(>\) \(r\) \(mod\) \(n\)
此时能取到的数的范围为上图的红色部分,这时答案为 \(n-1\)
上代码
#include
using namespace std;
int n,L,R;
int main(){
freopen("candy.in","r",stdin);
freopen("candy.out","w",stdout);
scanf("%d%d%d",&n,&L,&R);
if(R-L+1>=n)printf("%d\n",n-1);
else{
if(L%n<=R%n)printf("%d\n",R%n);
else printf("%d\n",n-1);
}
return 0;
}
CSP - J - 2 插入排序
题意简述:
给定长度为 \(n\) 的序列 \(a_i\) 。
现在要维护单点修改与冒泡排序后一元素的下标。
分析一下
记录一下原来的位置,从修改的位置开始,若修改值\(v\)比原来大,向后冒泡排序
否则向左
上代码
#include
#define N 8005
#define LL long long
using namespace std;
int n,q;
struct node{
int date;
LL num;
}a[N];
LL x;
int temp;
LL sss;
int main(){
scanf("%d%d",&n,&q);
for (int i=1;i<=n;i++){
scanf("%lld",&x);
a[i].num=x;
a[i].date=i;
}
for (int i=1;i<=n;i++){
for (int j=i;j>=2;j--)
if (a[j].num < a[j-1].num)
swap(a[j],a[j-1]);
}
for (int l=1;l<=q;l++){
int opt;int root;
scanf("%d",&opt);
if (opt==1){
scanf("%d%lld",&temp,&sss);
for (int i=1;i<=n;i++){
if (a[i].date==temp)
root=i;
}
if (sss>a[root].num){
a[root].num=sss;
for (int i=root;ia[i+1].num){
swap(a[i],a[i+1]);
}else if (a[i].num==a[i+1].num&&a[i].date>a[i+1].date){
swap(a[i],a[i+1]);
}else break;
}else if (sss1;i--)
if (a[i].numa[i].date){
swap(a[i],a[i-1]);
}else break;
}
}else {
scanf("%d",&temp);
for (int i=1;i<=n;i++)
if (a[i].date==temp){
printf("%d\n",i);
break;
}
}
}
return 0;
}
CSP - J - 3 网络连接
本人也不会缩行
一手大模拟上
#include
using namespace std;
int opt,n,h=0;
string s;
char c;
struct node{
int a,b,c,d,e;
int date;
}e[1005];
int main(){
scanf("%d",&n);
for (int l=1;l<=n;l++){
cin>>s;
if (s == "Server")
opt=1;
else opt=2;
int num[15]={0},x=0,flag=1;
bool mh=false;
bool boom=false,zero=false,ss=false,www=false;
c=getchar();
while(1){
c=getchar();
if ('0'<=c&&c<='9'){
if (zero==true){
boom=true;
break;
}
if (x==0&&c=='0')
zero=true;
x=x*10+c-'0';
ss=true;
}else if (c=='.'){
if (flag>4){
boom=true;break;
}if (!ss){
boom=true;break;
}
num[flag]=x;
flag++;
zero=false;
ss=false;
x=0;
}else if (c==':'){
if (mh){
boom=true;break;
}if (!ss){
boom=true;break;
}num[flag]=x;
if (flag!=4){
boom=true;
break;
}flag++;
x=0;
zero=false;
ss=false;
mh=true;
}else if (c=='\n'){
if (!mh){
boom=true;
break;
}
num[flag]=x;
if (!(num[1]<=255&&num[2]<=255&&num[3]<=255&&num[4]<=255&&num[5]<=65535)){
boom=true;
break;
}
if (opt==1){
for (int i=1;i<=h;i++){
if (e[i].a==num[1]&&e[i].b==num[2]&&e[i].c==num[3]&&e[i].d==num[4]&&e[i].e==num[5]){
printf("FAIL\n");
www=true;
break;
}
}
if (!www){
h++;
e[h].a=num[1];e[h].b=num[2];e[h].c=num[3];e[h].d=num[4];e[h].e=num[5];
e[h].date=l;
printf("OK\n");
}
}else if (opt==2){
for (int i=1;i<=h;i++){
if (e[i].a==num[1]&&e[i].b==num[2]&&e[i].c==num[3]&&e[i].d==num[4]&&e[i].e==num[5]){
printf("%d\n",e[i].date);
www=true;
break;
}
}if (!www)
printf("FAIL\n");
}
break;
}else{
boom=true;
break;
}
}
if (boom){
printf("ERR\n");
while (1){
if (c!='\n')
c=getchar();
else
break;
}
}
}
return 0;
}