2021csp-j游记
星期五晚上看了一下博客 看到有些人说在代码后面要加
fclose(stdin);fclose(stdout);
不管是不是真的先加上吧
星期六考了csp-j,我考得不怎么理想。
8:30开考 看了一下题的大概 觉得A题最简单 就先做A题
8:40 第一题做完了,用的是暴力枚举
#include<bits/stdc++.h>
using namespace std;
int n,l,r;
int ans=0;
int main(){
freopen("candy.in","r",stdin);
freopen("candy.out","w",stdout);
scanf("%d%d%d",&n,&l,&r);
for(int k=l;k<=r;k++){
ans=max(ans,k%n);
}
cout<<ans<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
但是看了一下数据10的9次方,应该要爆,所以改了一下,优化了不少
#include<bits/stdc++.h>
using namespace std;
long long n,l,r,ans;
int main() {
//freopen("candy.in","r",stdin);
//freopen("candy.out","w",stdout);
scanf("%lld%lld%lld",&n,&l,&r);
if(r-n<n) {
printf("%lld",r-n);
return 0;
}
ans=l/n*n;
ans=r-ans;
if(ans>=n) {
printf("%lld",n-1);
} else {
printf("%lld",ans);
}
return 0;
}
但是这个代码在自己造的有个数据过不去,又改了一下,
#include<bits/stdc++.h>
using namespace std;
long long n,l,r,ans;
int main() {
//freopen("candy.in","r",stdin);
//freopen("candy.out","w",stdout);
scanf("%lld%lld%lld",&n,&l,&r);
ans=l/n*n;
ans=r-ans;
if(ans>=n) {
printf("%lld",n-1);
} else {
printf("%lld",ans);
}
return 0;
}
这下觉得行了,这时8:55 开始看下题
第一眼看到B题觉得有点难于是直接跳过B题,直接看C题
第一眼看C题感觉有点像搜索
于是就有了下面这个代码
#include<bits/stdc++.h>
using namespace std;
int n,k,l,ans=1,w=-1,ans3,ans2;
string s,s2,a[10005],b[10005];
void dfs(int n) {
if(s2[n]=='.'||s2[n]==':') {
if(ans<=3) {
if(ans==1||ans==2) {
w=0;
ans=1;
dfs(n+1);
}
if(ans==3) {
if((s2[n-1]-'0'+(s2[n-2]-'0')*10+(s2[n-3]-'0')*100)<=255) {
w=0;
ans=1;
dfs(n+1);
} else {
w=1;
return ;
}
}
} else {
w=1;
return ;
}
}
if(s2[n]==':'){
ans3++;
}
if(s2[n]=='.'){
ans2++;
}
if(ans2>3||ans3>1){
w=1;
return ;
}
else if(n==s2.length()-1) {
ans+=2;
if(ans<=5) {
if(ans==1||ans==2||ans==3||ans==4) {
w=0;
return ;
} else if(ans==5) {
if((s2[n]-'0'+(s2[n-1]-'0')*10+(s2[n-2]-'0')*100+(s2[n-3]-'0')*1000+(s2[n-4]-'0')*10000)<=65535&&s2[n-5]==':') {
w=0;
return ;
} else {
w=1;
return ;
}
}
}
} else {
ans++;
dfs(n+1);
}
}
int main() {
//freopen("network.in","r",stdin);
//freopen("network.out","w",stdout);
cin>>n;
for(int i=1; i<=n; i++) {
cin>>s;
cin>>s2;
a[i]=s2;
b[i]=s[0];
if(s[0]=='S') {
ans=1;
w=-1,k=0,ans2=0,ans3=0,ans=0;
dfs(0);
if(w==0) {
for(int j=1; j<i; j++) {
if(b[j]=="S"&&a[j]==s2) {
k=1;
cout<<"FATL"<<endl;
}
}
if(k==0) {
cout<<"OK"<<endl;
}
} else {
cout<<"ERR"<<endl;
}
}
if(s[0]=='C') {
if(k!=0) {
cout<<"ERR";
} else {
int p=0;
for(int j=1; j<i; j++) {
if(a[j]==s2&&b[j]=="S") {
cout<<j<<endl;
p=1;
break;
}
}
if(p==0){
cout<<"ERR";
}
}
}
}
}
由于中间调了一下代码,所以导致 做完已经11:00了,额、然后就去看了D题 发现他需要删除
但是没想到用队列 就打了个暴力 但是连样例都没过,不管了,先看一下其他的,一直检查到11:50
去看了一下B题,发现可以暴力拿部分分,但是来不及了,考试下来打了一个拿了50分 后悔。
总的来说并没有考好 还是子、自己代码能力太弱 没有认真思考
总分只有120多分