L2-014 列车调度 (25 分)
upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)返回一个非递减序列[first, last)中的第一个大于值val的位置
lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
/*
842 1
53
96
7
*/
int main()
{
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集合中有比它大的最小的数
{
s.erase(s.upper_bound(a));//删除这个数
}
s.insert(a);
}
cout<<s.size()<<endl;
}
L2-005 集合相似度 (25 分)
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()):求两个容器的交集
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int main()
{
int n;
cin>>n;
set<int>s[n];//注意用集合数组,这样更方便
for(int i=0;i<n;i++)
{
int nn;
cin>>nn;
for(int j=0;j<nn;j++)
{
int a;
cin>>a;
s[i].insert(a);
}
}
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int b,c,d=0;
cin>>b>>c;
for(auto it=s[b-1].begin();it!=s[b-1].end();it++)
{
if(s[c-1].count(*it))d++;
}
set<int>s2;
//cout<<d<<" "<<s[b-1].size()+s[c-1].size()-d<<endl;
printf("%.2f%\n",d*100.0/(s[b-1].size()+s[c-1].size()-d));
}
}
L2-029 特立独行的幸福 (25 分)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
#define speed_up ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int fs(int n)//素数模板
{
if(n==1)return 0;
if(n==3||n==2)
return 1;
if(n%2==0)
return 0;
if(n%6!=1&&n%6!=5)
return 0;
for(int i=5;i<sqrt(n)+1;i+=6)
{
if(n%i==0||n%(i+2)==0)
return 0;
}
return 1;
}
int main()
{
int a,b,n;//区间
cin>>a>>b;
set<int>s;//存一个数每次迭代得到的数
set<int>s2;//存每一个数每次迭代得到的数
ll ss=0;//暂存迭代后得到的数
vector<int>v;//将这个数每一位存入数组方便计算
int f=0;//从第二次循环开始,将迭代后的数每一位存入数组
map<int,int>mp;
while(a<=b)
{
n=a;
a++;
f=0;
while(1)
{
if(f!=0)n=ss;
ss=0;
while(n!=0)
{
int t;
t=n%10;
n/=10;
v.push_back(t);
}//2 4 16 37 58 64+25=89 81+64=145 1+16+25=42 20 4
f++;
for(int i=0; i<v.size(); i++)
{
//cout<<v[i]<<" ";
ss+=v[i]*v[i];
}
//cout<<endl;
//cout<<ss<<endl;
s2.insert(ss);
if(s.find(ss)==s.end())s.insert(ss);
else
{
//cout<<"*"<<endl;
break;//不是幸福数
}
if(ss==1)
{
mp[a-1]=f;
break;
}
v.clear();
}
v.clear();
s.clear();
}
//判断一下这个数是否依附于其他数
for(auto it=mp.begin();it!=mp.end();it++)
{
int tt=it->first;
int t2=it->second;
if(s2.find(tt)==s2.end())
{
if(fs(tt))cout<<tt<<" "<<t2*2<<endl;
else cout<<tt<<" "<<t2<<endl;
}
}
if(mp.size()==0)cout<<"SAD"<<endl;
}