A. 糖果

题目类型:数学

思路

对于这道题目我们首先可以想到从llrr遍历,来得到最大的余数。但是,因为llrr最大有10910^9的差,所以会超时。那我们就要换一种办法了。经过观察后,我们发现其实答案只有两种:

  • n1n-1

  • rr%nn

所以公式就是:

min(l+(n1lmin(l+(n-1-l%n),r)n),r)%nn

代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("candy.in","r",stdin);
	freopen("candy.out","w",stdout);
	int n,l,r;
	cin>>n>>l>>r;
	cout<<min(l+(n-1-l%n),r)%n;
	return 0;
}

这道题目在考试的时候我写的代码漏掉了一个情况,所以只得了90分,下一次一定要再细心一点。

C. 网络

题目类型:模拟

思路

其实这道题目就是一个大模拟,分情况讨论即可,分类如下:

  • Server状态下:
  • 若合法,输出字符串 OK
  • 若合法,但先前有相同的字符串,输出字符串 FAIL
  • 若不合法,输出字符串 ERR
  • Client状态下:
  • 若合法且有相匹配的连接时,输出一个正整数表示连接到的编号。
  • 若合法但没有相匹配的连接时,输出字符串 FAIL
  • 若不合法,输出字符串 ERR

判断合法的条件:

  • 必须形如 a.b.c.d:e 的格式,
  • 0a,b,c,d2550e655350≤a,b,c,d≤255,0≤e≤65535
  • a,b,c,d,ea,b,c,d,e 均不能含有多余的前导00

代码

#include<bits/stdc++.h>
using namespace std;
unordered_map<string,int> mp;
bool check(string s){
	vector<int> c(5,-1);
	sscanf(s.c_str(),"%d.%d.%d.%d:%d",&c[0],&c[1],&c[2],&c[3],&c[4]);
	for(int i=0;i<=4;i++){
		if(c[i]<0) return 1;
		if(i<=3) if(c[i]>255) return 1;
		if(i==4) if(c[i]>65535) return 1;
	}
    char h[100];
    sprintf(h,"%d.%d.%d.%d:%d",c[0],c[1],c[2],c[3],c[4]);
    return h!=s;
}
int main(){
	freopen("net.in","r",stdin);
	freopen("net.out","w",stdout); 
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){ 
		string a,b;
		cin>>a>>b;
		if(check(b)) cout<<"ERR"<<endl;
		else if(a=="Server"){
			if(mp[b]) cout<<"FAIL"<<endl;
			else{
				cout<<"OK"<<endl;
				mp[b]=i;
			}
		}
		else if(a=="Client"){
			if(!mp[b]) cout<<"FAIL"<<endl;
			else{
				cout<<mp[b]<<endl;
			}
		}
	}
	return 0;
}

对于这道题目在考试的时候代码是写了,但没过样例,所以没交,下次一定要提升代码能力。