2020 11 14 天梯赛
7-1 阅览室
思路:对于每一天的借书,用一个map存储书号和时间,当还书时,首先在map中寻找,如果找到了,则说明此书可以被还,用此时的时间-map中存储的时间就是这本书被借走的时间。同时,如果书被归还,要在map中删除该书,以便下一个人借。
启示:比赛的时候WA是因为读错了题,错以为一本书每天只能借一次。这几次打天梯赛退步不少,事后分析许多题本来便能做出来,但因为做的太急了,导致许多细节处理不当。做题时不要贪图快,要先保证正确率,读懂题意!
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
vector<vector<int>>v;
int main()
{
int n,i,j,k;
map<int,int>m;
cin>>n;
while(n--)
{
m.clear();
double num=0;
int ans=0;
while(1)
{
cin>>i;
char c;
cin>>c;
char y;
int h,mi;
cin>>h>>y>>mi;
int sum=h*60+mi;
if(c=='S')
{
m[i]=sum;
}
else if(c=='E')
{
if(m.find(i)!=m.end())
{
num+=sum-m[i];
m.erase(i);
ans++;
}
else
{
;
}
}
if(i==0)
{
break;
}
}
cout<<ans<<" ";
if(ans==0)
{
cout<<0<<endl;
}
else
printf("%.0f\n",num/ans);
}
return 0;
}
7-11 集合相似度
思路:用一个set数组存储每一个集合。在判断时先遍历其中一个集合的每一个元素,如果该元素在另一个集合中出现过,便存入另一个set,最后该set的大小就是nc。
nt可以直接用数学公式计算出来。nt=a.size()+b.size()-nc
启示:这道题也是在没有看题解的情况下做出来了,比赛的时候一直WA最后一个点,原因是写的代码有大量的冗余,而且没有找出求nt的规律。静下心来的话发现每一个题都简单了不少。静心!
代码如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
int n,i,j,k,m,nc,nt;
set<int>s[55];
cin>>n;
for(i=1;i<=n;i++)
{
cin>>m;
while(m--)
{
cin>>k;
s[i].insert(k);
}
}
cin>>k;
while(k--)
{
int a,b;
cin>>a>>b;
int common=0;
set<int>ans;
set<int>::iterator is;
for(is=s[a].begin();is!=s[a].end();is++)
{
if(s[b].find(*is)!=s[b].end())
{
ans.insert(*is);
}
}
nc=ans.size();
nt=s[a].size()+s[b].size()-nc;
double degree=(double)nc/nt;
degree*=100;
printf("%.2lf%\n",degree);
}
return 0;
}
7-10 关于堆的判断
思路:根据小顶堆的定义建立模型,然后根据题意判断即可。需要注意输入的数是负数的情况。
启示:首先是之前从来没有接触过小顶堆的概念,比赛的时候无从下手,补题的时候一直WA是因为没有注意到输入的数可能是负数的情况。仔细读题!不要急!静心!
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[2000];
int num=0;
void add(int x)
{
a[++num]=x;
int t=num;
while(t>1&&(a[t]<a[t/2]))
{
int tem=a[t];
a[t]=a[t/2];
a[t/2]=tem;
t/=2;
}
}
int ffind(int x)
{
int i,k,ans,j;
for(i=1;i<num;i++)
{
if(a[i]==x)
{
return i;
}
}
//return 0;
}
int main()
{
int n,m,i,j,k;
cin>>n>>m;
for(i=0;i<n;i++)
{
cin>>k;
add(k);
}
// cout<<"a[1]="<<a[1]<<endl;
//cout<<"26="<<ffind(26)<<endl;
//cout<<"23="<<ffind(23)<<endl;
while(m--)
{
string s;
int x,y;
cin>>x;
cin.ignore();
getline(cin,s);
//cout<<s<<endl;
//cout<<"s[3]="<<s[7]<<endl;
int len=s.size();
//cout<<len<<endl;
//cout<<"slen-1="<<s[len-1]<<endl;
if(s[len-1]=='t')
{
//cout<<1<<" "<<s<<endl;
if(a[1]==x)
cout<<"T"<<endl;
else
{
cout<<"F"<<endl;
}
}
else if(s[len-1]=='s')
{
// cout<<2<<" "<<s<<endl;
int start,en;
start=4;
for(i=4;i<len-1;i++)
{
if(s[i+1]==' ')
{
en=i;
break;
}
}
int sum=0;
int u=1;
for(i=en;i>=start+1;i--)
{
sum+=u*(s[i]-'0');
u*=10;
}
if(s[start]=='-')
{
sum*=-1;
}
else
{
sum+=u*(s[start]-'0');
}
y=sum;
int root1=ffind(x)/2;
int root2=ffind(y)/2;
if(root1==root2)
{
cout<<"T"<<endl;
}
else
{
cout<<"F"<<endl;
}
}
else if(s[7]=='p')
{
//cout<<3<<" "<<s<<endl;
//cout<<"x====="<<x<<endl;
int start=17;
int en=len-1;
//cout<<"start="<<s[start]<<endl;
// cout<<"len-1="<<s[len-1]<<endl;
int sum=0;
int u=1;
for(i=en;i>=start+1;i--)
{
sum+=u*(s[i]-'0');
u*=10;
}
if(s[start]=='-')
{
sum*=-1;
}
else
{
sum+=u*(s[start]-'0');
}
y=sum;
int root=ffind(y)/2;
if(a[root]==x)
{
cout<<"T"<<endl;
}
else
{
cout<<"F"<<endl;
}
}
else if(s[3]=='a')
{
// cout<<4<<" "<<s<<endl;
int start=14;
int en=len-1;
int sum=0;
int u=1;
for(i=en;i>=start+1;i--)
{
sum+=u*(s[i]-'0');
u*=10;
}
if(s[start]=='-')
{
sum*=-1;
}
else
{
sum+=u*(s[start]-'0');
}
y=sum;
int root=ffind(x);
root/=2;
if(a[root]==y)
{
cout<<"T"<<endl;
}
else
{
cout<<"F"<<endl;
}
}
// cout<<x<<" "<<y<<endl;
}
return 0;
}