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;
}