ACM 实验室2020.11.14天梯赛练习*6+平时练习
7-1 阅览室 (20分)
这道题开始想复杂了写的很乱,想明白了思路很简单,先定义两个数组,一个存书编号,一个存转换为分钟的时间,然后定义两个数cnt,sum分别是有效借了几本书和总时间的和。如果按过S,存入书号,如果再按下E,这本书就的时间可以算上。只有满足这两个才有效其他情况不计。注意每次外层循环要清空数组,还有最后要四舍五入(+0.5)结果要输出整形。
int a[1010];
int b[1010];
int main()
{
speed_up;
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int cnt=0,sum=0;
memset(a,0,1010);//*
while(1)
{
int d,h,m;
char c,cc;
cin>>d>>c>>h>>cc>>m;
if(d==0)
{
break;
}
if(c=='S')
{
a[d]=1;
b[d]=h*60+m;
}
if(c=='E'&&a[d]==1)
{
a[d]=0;
cnt++;
sum+=h*60+m-b[d];
}
}
if(cnt==0)cout<<0<<" "<<0<<endl;
else
{
cout<<cnt<<" "<<(int)(1.0*sum/cnt+0.5)<<endl;//*
}
}
}
7-11 集合相似度 (25分)
这个题就是用了set集合数组和set.count()
set::count()是C++ STL中的内置函数,它返回元素在集合中出现的次数。由于set容器仅包含唯一元素,因此只能返回1或0。
用法:
set.count(x)
参数:该函数接受一个强制性参数x ,该元素指定要返回其计数的元素。
返回值:该函数返回1或0,因为该集合仅包含唯一元素。如果设置的容器中存在该值,则返回1。如果容器中不存在它,则返回0。
也可以用set_intersection(s1.begin(),s1.end(),s2.begin(),s2.end(),inserter(s3,s3.begin()):求两个容器的交集
7-18 列车调度 (25分)
set中的一个函数:
upper_bound()函数,会直接查找与传入的值最接近的且比其大的数
8 4 2 5 3 9 1 6 7
2367
1
459
8
存入set集合的数是2148
int main()
{
speed_up;
int n;
cin>>n;
set<int>s;
for(int i=0;i<n;i++)
{
int a;
cin>>a;
if(s.upper_bound(a)!=s.end())
{
s.erase(s.upper_bound(a));//如果集合中有比a大的最小的数,就删掉这个数换成a
}
s.insert(a);//存入此时车道上的最小值,相当于新开一条车道
}
cout<<s.size()<<endl;
}

浙公网安备 33010602011771号