csp201812

小明上学

实现

#include<bits/stdc++.h>
using namespace std;
int r,y,g;
int n,k,t;
int res;
int main()
{
    
    
    cin>>r>>y>>g;
    cin>>n;
    for(int i=0;i<n;i++)
    {
    
    
        scanf("%d %d",&k,&t);
        if(k==0) res+=t;
        else if(k==3) res+=0;
        else if(k==1) res+=t;
        else res+=(t+r);
    }
    cout<<res;
}

小明放学

思路

根据初始时刻的状态,计算出哪一个时刻是该交通灯的"0"时刻,用该时刻加上res(走到该红绿灯处花了多长时间)再模(r+y+g)即可知道该时刻对应的是什么颜色的交通灯。

实现

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

int main()
{
    
    
    int r, y, g;
    cin >> r >> y >> g;
    int n;
    cin >> n;

    LL res = 0;
    while (n -- )
    {
    
    
        LL k, t;
        cin >> k >> t;
        if (!k) res += t;
        else
        {
    
    
            if (k == 1) t = r - t;
            else if (k == 2) t = r + y + g - t;
            else t = r + g - t;
            t += res;
            t %= r + y + g;
            if (t < r) res += r - t;
            else if (t >= r + g) res += r + g + y - t + r;
        }
    }
    cout << res << endl;
    return 0;
}

CIDR合并

实现

#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 100010;
struct ip
{
    
    
	string name;
	int k; //前缀长度 
	bool operator< (const ip& t) const
	{
    
    
		if(name!=t.name) return name<t.name;
		return k<t.k;
	}
	bool is_substr(ip& t) //判断当前串是否是t的子串 
	{
    
    
		if(t.k<k) return false;
		if(name.substr(0,k)!=t.name.substr(0,k)) return false;
		return true;
	}
    int get_number(string str)
    {
    
    
        int res = 0;
        for (int i = 0; i < 8; i ++ )
            res = res * 2 + str[i] - '0';
        return res;
    }
    void print()
    {
    
    
        for (int i = 0; i < 32; i += 8)
        {
    
    
            if (i) printf(".");
            printf("%d", get_number(name.substr(i, 8)));
        }
        printf("/%d\n", k);
    }
}ips[N];
struct ip merge(struct ip a,struct ip b)
{
    
    
	struct ip res;
	res.k = -1;
	if(a.k!=b.k) return res;
	if(a.name.substr(0,a.k-1)!=b.name.substr(0,b.k-1)) return res;
	else
	{
    
    
		res.k = a.k-1;
		res.name = a.name.substr(0,a.k-1);
		while(res.name.size()<=32) res.name+='0';
		return res;
	}
}
int main()
{
    
    
	cin>>n;
	string str;
	int tmp[4];
	int cnt;
	for(int i=0;i<n;i++)
	{
    
    
		cin>>str;
		cnt = 0;
		memset(tmp,0,sizeof tmp);
		int j=0;
		while(str[j]!='/' && j<str.size())
		{
    
    
			if(str[j]=='.') j++;
			int k = j;
			while(k<str.size() && str[k]!='.' && str[k]!='/') k++;
			
			tmp[cnt] = stoi(str.substr(j,k-j));
			
			//cout<<cnt<<"  "<<tmp[cnt]<<endl;
			cnt++;
			j = k;
			//cout<<"k:---"<<k<<"  "<<str[k]<<endl;
		}
		if(j==str.size())   //省略了长度的情况
		{
    
    
			ips[i].k = 8*cnt;
		//	cout<<endl<<ips[i].k<<endl;
		}
		else
		{
    
    
			ips[i].k = stoi(str.substr(j+1));
			//cout<<endl<<ips[i].k<<endl;
		}
		for(int tt=0;tt<4;tt++)
		{
    
    
			for(int ct=7;ct>=0;ct--)
			{
    
    
				char a = ((tmp[tt]>>ct)&1)+'0';
				//cout<<((tmp[tt]>>ct)&1);
				ips[i].name+=a;
			}
		}
		//cout<<ips[i].name<<endl;
	}
	
	
	sort(ips,ips+n);
	int k=1;
	for(int i=1;i<n;i++)
	{
    
    
		if(!ips[k-1].is_substr(ips[i])) ips[k++] = ips[i];
	}
	n = k;
	
	k=1;
	for(int i=1;i<n;i++)
	{
    
    
		ips[k++] = ips[i];
		while(k>=2)
		{
    
    
			auto t = merge(ips[k-2],ips[k-1]);
			if(t.k!=-1)
			{
    
    
				k-=2;
				ips[k++] = t;
			}
			else break;
		}
	}
	n = k;
    for (int i = 0; i < n; i ++ )
        ips[i].print();	
}

猜你喜欢

转载自blog.csdn.net/Tracy_yi/article/details/129216587