小明上学
实现
#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();
}