放在一切的前面:
其实,这次我打的不是太好······
最后打了270多分······
分数和排名···
其实,我们弱省这就是一等奖了,全国不高。
话说我只AC一道题就很离谱······
【题解】P7909 [CSP-J 2021] 分糖果
题意:
给定 n , L , R n,L,R n,L,R,选取一个正整数 k ( L ≤ k ≤ R ) k(L \le k \le R) k(L≤k≤R) ,使 k m o d n k\bmod n kmodn 的值 a n s ans ans最大,输出这个 a n s ans ans .
思路:
根据取余运算的定义,我们可以得到如下结论:
a n s ≤ n − 1 ans \le n-1 ans≤n−1
也就说,我们要使 a n s ans ans尽可能地接近 n − 1 n-1 n−1,有如下两种情况:
- 能找到一个 k m o d n = n − 1 k \bmod n = n-1 kmodn=n−1 ,那么我们就输出 n − 1 n-1 n−1;
- 不能找到 k m o d n = n − 1 k \bmod n = n-1 kmodn=n−1 ,那么我们就输出最接近 n − 1 n-1 n−1的值。
做法:
我们求一个 z z z.
令 z = L m o d n z=L \bmod n z=Lmodn .
那么,在 k m o d n = n − 1 k \bmod n = n-1 kmodn=n−1 中, k = n − 1 − z + L k=n-1-z+L k=n−1−z+L ;
我们只需要判定这个数字有没有超过 R R R 就可以:
- k ≤ R k \le R k≤R ,直接输出 k k k即可。
- k > R k > R k>R ,可得知 R m o d n R \bmod n Rmodn 不会变得更小,所以最大值是 R m o d n R \bmod n Rmodn.
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,l,r,z;
int main(){
scanf("%lld%lld%lld",&n,&l,&r);
z=l%n;
if(n-1-z+l<=r) printf("%lld",n-1);
else printf("%lld",r%n);
return 0;
}
【题解】P7910 [CSP-J 2021] 插入排序
这道题,典型的模拟优化:
我们尽可能在修改时进行计算
我们先用 s o r t sort sort进行第一次,也是唯一一次查询,为了不改变原有数组的位置,我们用两个数组。
处理时,我们应该逐个比较,根据我们的需要来进行数位的动态维护。
我们在第二类就可以直接输出。
代码在博客园里。
【题解】P7911 [CSP-J 2021] 网络连接
这道题典型的模拟;
模拟这个东西,其实很简单。
A+B问题就是最简单的模拟。
我们只要按照题意判定,然后就能得出AC代码。
易错点:
- 前导零没有判断:
建议在判断字符时直接判断。 - 没有判断两个符号连接在一起的情况:
建议判断是否有数字出现。 - 数字难以处理:
建议用数字记录:sum=sum*10+a[i]-'0';
- 没有足够的符号:
建议记录出现多少符号。
AC代码:
#include<bits/stdc++.h>
using namespace std;
map<string,bool> pd1;
map<string,int> pd2;
long long n;
struct computr{
string s1,s2;
long long id;
}a[1001];
int main(){
// freopen("network.in","r",stdin);
// freopen("network.out","w",stdout);
scanf("%lld",&n);
for(long long i=1;i<=n;i++){
cin>>a[i].s1>>a[i].s2;
a[i].id=i;
string t=a[i].s2;
bool w=1;
int pd=0;
bool hnum=0,tpd=1;
for(int j=0,sum=0;j<a[i].s2.size();j++){
if(j==0){
if(a[i].s2[j]=='0' and (a[i].s2[j+1]>='0' and a[i].s2[j+1]<='9')){
w=0;
cout<<"ERR\n";
break;
}
}
if(a[i].s2[j]<'0' || a[i].s2[j]>'9'){
tpd=1;
if(a[i].s2[j+1]=='0' and (a[i].s2[j+2]>='0' and a[i].s2[j+2]<='9')){
w=0;
cout<<"ERR\n";
break;
}
if((pd==0||pd==1||pd==2) && a[i].s2[j]!='.'){
w=0;
cout<<"ERR\n";
break;
}
else if(pd==3 && a[i].s2[j]!=':'){
w=0;
cout<<"ERR\n";
break;
}
else if(!hnum){
w=0;
cout<<"ERR\n";
break;
}
else sum=0,pd++,tpd=0;
hnum=0;
}
else{
if(a[i].s2[j-1]=='0' and !hnum){
w=0;
cout<<"ERR\n";
break;
}
hnum=1;
sum=sum*10+a[i].s2[j]-'0';
if(pd==0 || pd==1 || pd==2 || pd==3)
if(sum<0 || sum>255){
w=0;
cout<<"ERR\n";
break;
}
if(pd==4)
if(sum<0 || sum>65535){
w=0;
cout<<"ERR\n";
break;
}
if(pd>4){
w=0;
cout<<"ERR\n";
break;
}
tpd=0;
}
}
if(w==0) continue;
if(pd<4 || !hnum){
w=0;
cout<<"ERR\n";
continue;
}
if(a[i].s1=="Server"){
if(pd1[t]){
cout<<"FAIL\n";
continue;
}
else{
cout<<"OK\n";
pd1[t]=1;
pd2[t]=i;
}
}
else{
if(pd1[t]) cout<<pd2[t]<<"\n";
else cout<<"FAIL\n";
}
}
return 0;
}
此时,机房旁边一位大哥因斗地主而愁眉苦脸。
【题解】P7912 [CSP-J 2021] 小熊的果篮
建议用链表或set
写:
尤其是set
如果会使用如上的任意一种数据结构,就能AC。
如果不了解,我写什么也没什么必要吧···
AC code 不放了,祝大家AC这道氵绿题。
推荐代码:
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,a[N];
set<int> st[2];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",a+i),
st[a[i]].insert(i);
st[0].insert(1e9);
st[1].insert(1e9);
while(*st[0].begin()!=1e9||*st[1].begin()!=1e9){
int now=min(*st[0].begin(),*st[1].begin());
for(;now!=1e9;now=*st[a[now]^1].lower_bound(now)){
printf("%d ",now);
st[a[now]].erase(now);
}
puts("");
}
return 0;
}//by shy