CSP 2018-12

1.小明上学
无脑模拟即可

#include<iostream>
using namespace std;
int r,y,g;
int n,k,t;
#define ll long long
int main(){
	ll ans=0;
	cin>>r>>y>>g;
	cin>>n;
	while(n--){
		cin>>k>>t;
		if(k==0){
		ans+=t;	
		}
		if(k==1){
			ans+=t;
		}if(k==2){
			ans+=t+r;
		}if(k==3){
			continue;
		}
	}
	cout<<ans;
}

2.小明放学
和上一题差不多的模拟题,我用now来表示到达改红绿灯时的时间在一个红绿黄周期内是第now秒
看了y总的视频和我的思路一样,就不附他的代码了

#include<iostream>

using namespace std;
int r,y,g;
int n,k,t;
#define ll long long
int get(int now){
	if(now<r) 			return r-now; //当前是红灯 
	if(r<=now&&now<r+g) return 0; //当前是绿灯
	return r+r+g+y-now;		//当前是黄灯 
}
int main(){
	cin>>r>>y>>g;
	cin>>n;
	ll ans=0;
	while(n--){
		cin>>k>>t;
		if(k==0){
			ans+=t;
		}if(k==1){ //出发时刻是红灯 
			ll now=(ans+r-t)%(r+y+g);//当前是一个循环内的第几秒
			ans+=get(now);
		}if(k==2){	//黄 
			ll now=(ans+r+g+y-t)%(r+y+g);
			ans+=get(now);
		}if(k==3){	//绿 
			ll now=(ans+r+g-t)%(r+y+g);
			ans+=get(now);
		}
	}
	cout<<ans;	
}

3.CIDR合并
又臭又长的辣鸡代码,目前只有80分,等我日后来改

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int de_to_int(const string &str){
	int x=0;
	for(int i=0;i<str.length();i++){
		x=x*10+str[i]-'0';
	}
	return x;
}
	
	int to_int(const string &str){
		int x=0;
		for(int i=0;i<str.length();i++){
			x=x*2+str[i]-'0';
		}
		return x;
	}
	
string to_str(int x){
		string res="";
		while(x){
			res+=x%10+'0';
			x/=10;
		}
		reverse(res.begin(),res.end());
		return res;
	}
	
	string to_bin(const string &str){
		int x=0;
		for(int i=0;i<str.length();i++){
			x=x*10+str[i]-'0';
		}
		string res="";
		while(x){
			if(x&1) res+="1";
			else res+="0";
			x>>=1;
		}
		while(res.length()!=8)
		res+="0";
		reverse(res.begin(),res.end());
		return res;
	}
	
struct node{
	string s;
	int len;
	
	bool operator<(const node &nd)const{
	if(s==nd.s) return len<nd.len;
	return s<nd.s;
	}
	
	void get(const string &line){ //处理标准型 
		for(int i=0;i<line.length();){
		int j=i;
		while(j<line.length()&&line[j]!='.'&&line[j]!='/') j++;
		if(j>=line.length())
		len=de_to_int(line.substr(i));
		else s+=to_bin(line.substr(i,j-i));
		i=j+1;
	}
	}
	void out(){
		cout<<to_int(s.substr(0,8))<<"."<<to_int(s.substr(8,8))<<"."<<to_int(s.substr(16,8))<<"."<<to_int(s.substr(24,8))<<"/"<<len<<endl;
	}
	bool contain(node &b)const{ //a是否包含b 
	return len<b.len&&s.substr(0,len)==b.s.substr(0,len);
	}
	bool uni(node &b){ //将b融入a 
	if(len==b.len&&s.substr(0,len-1)==b.s.substr(0,b.len-1)&&s[len-1]!=b.s[b.len-1]){
		s[--len]='0';
		return true;
	}
	return false;
	}
	node(){
	string line;
	getline(cin,line);	
	int p=1;
	for(int i=0;i<line.length();i++)
	p+=line[i]=='.';
	
	if(line.find("/")==-1){
		for(int i=p;i<4;i++){
			line+=".0";
		}
		line+="/"+to_str(p*8);
	}else{
		int place=line.find("/");
		for(int i=p;i<4;i++){
			line.insert(place,".0");
		}
	}
	get(line);
	}
};

int main(){
	vector<node> v;
	int n;
	cin>>n;
	getchar();
	while(n--)
		v.push_back(node ());
		
	sort(v.begin(),v.end());
		
	for(int i=0;i+1<v.size();){
	if(v[i].contain(v[i+1]))
		v.erase(v.begin()+i+1);
	else	i++;
	}
	
	for(int i=0;i+1<v.size();){
		if(v[i].uni(v[i+1]))
		v.erase(v.begin()+i+1),i=max(0,i-1);		
		else i++;
	}
	
	sort(v.begin(),v.end());
	
	for(int i=0;i+1<v.size();){
	if(v[i].contain(v[i+1]))
		v.erase(v.begin()+i+1);
	else	i++;
	}
	
	for(int i=0;i+1<v.size();){
		if(v[i].uni(v[i+1]))
		v.erase(v.begin()+i+1),i=max(0,i-1);		
		else i++;
	}
	
	for(int i=0;i<v.size();i++){
		v[i].out();
	}	
	
}

4.数据中心
克鲁斯卡尔算法裸题

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define N 50010
int n,m,root;
int ufs[N];
int find(int a){
	if(a==ufs[a]) return a;
	return ufs[a]=find(ufs[a]);
}
void uni(int a,int b){
	int fa=find(a),fb=find(b);
	if(fa!=fb) ufs[fa]=ufs[fb];
}
struct node{
	int s,e,v;
	bool operator<(const node& nd)const{
	return v<nd.v;
	}
};
vector<node> vec;
int ans=-1;
int main(){
	cin>>n>>m>>root;
	for(int i=0;i<=n;i++)
	ufs[i]=i;
	while(m--){
		int s,e,v;
		cin>>s>>e>>v;
		vec.push_back((node){s,e,v});
	}
	
	sort(vec.begin(),vec.end());
	
	for(int i=0;i<vec.size();i++){
		node nd=vec[i];
		if(find(nd.s)==find(nd.e)) continue ;
		uni(nd.s,nd.e);
		ans=max(ans,nd.v);
	}		
	cout<<ans<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值