放在前面:各位同学一定要好好复习初赛……不要像我一样初赛都没过……
1.P7909
作为第一题……肯定不会很难(我还是卡了一下TAT)
可以想到输出的结果一定是 0~(n-1)
关键在于是判断输出n-1还是其他
- L到R之间的区间超过n 输出(n-1)
- L到R之间的区间小于n 输出最大解(r%n)
上代码:
#include<bits/stdc++.h>
using namespace std;
int n,l,r,a,b;
int main()
{
cin>>n>>l>>r;
a=l/n;
b=r/n;
//判断区间
if(a==b) cout<<r%n;
else
cout<<n-1;
return 0;
}
理解一下应该不太难(相比于其他题解做法,这个要讨论的情况不会太多,不容易出错)
2.P7910
这道题的题目理解相对难一(hen)点(duo)
关键在于选择排序是个稳定排序(复习一下初赛知识——稳定排序有:希尔选择快速堆
还有就是解决超时问题
H 老师不喜欢过多的修改,所以他保证类型 1 的操作次数不超过 5000。
所以我们选择对类型1下手……!
关键点:操作类型1时顺便排序
还有就是一些……奇奇怪怪的错误
代码(虽然代码写的繁琐,但是思路还是很明确的……其实是我太菜):
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
int n,m,kind,x,v,ans;
struct number
{
int a,ans;
}p[8005],b[8005];//b数组是为了方便转换
//p.a保存原数组
//p.ans是保存排序后的下标
//b为排序后的数组
//b.ans是排序前的下标(用于转换)
bool cmp(number x,number y)//sort
{
if(x.a!=y.a)
return x.a<y.a;
else
return x.ans<y.ans;
}
bool r(number x,number y)//十分繁琐的判断是否可以交换
{
if(x.a==y.a) return x.ans>y.ans;
return x.a>y.a;//稳定排序下标也需要比较
}
bool l(number x,number y)//十分繁琐的判断是否可以交换
{
if(x.a==y.a) return x.ans<y.ans;
return x.a<y.a;//稳定排序下标也需要比较
}
void right()
{
b[p[x].ans].a=v;
for(int k=p[x].ans;k<n;k++)
{
if(r(b[k],b[k+1]))//码代码小tip:当判断十分繁琐……再用一个函