反思:这周写的题目比上周要多很多,感觉还是应该多做题,不然的话还是不太行。这篇主要是记录一下上周周赛比较好的题目,还有就是传智杯初赛的好题,好的知识点。
一:week10的好题:
一:
week10 - Virtual Judge 这道题我之所以觉得好,不是因为题目难,而是原来我没有想到的用法。就是set,其用法在我上一篇的博客有讲到。
其实就是用到如何去在set中插入一个数组,还有就是set的简单运用。
代码:
#include<bits/stdc++.h>
using namespace std;
set<vector<int> > s;
int n,l,t;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
vector<int>a;
cin>>l;
for(int j=1;j<=l;j++)
{
cin>>t;
a.push_back(t);
}
s.insert(a);
}
cout<<s.size();
return 0;
二:第二道题目:
为啥觉得这道题特别好,就是因为,他综合使用了链表,dfs,bfs,vector的综合使用。
采用了两种方法遍历。很好理解。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> g[100005];
int st[100005];
void dfs(int n)
{
if(!st[n])
cout<<n<<" ";
st[n]=1;
for(int i=0;i<g[n].size();i++)
{
if(!st[g[n][i]])
dfs(g[n][i]);
}
}
void bfs(int n)
{
queue<int>q;
q.push(n);
st[n]=1;
while(!q.empty())
{
int t=q.front();
cout<<t<<" ";
q.pop();
for(int i=0;i<g[t].size();i++)
{
if(st[g[t][i]]==0)
{
st[g[t][i]]=1;
q.push(g[t][i]);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
g[a].push_back(b);
}
for(int i=1;i<=n;i++)
sort(g[i].begin(),g[i].end());
dfs(1);
memset(st,0,sizeof(st));
cout<<'\n';
bfs(1);
}
里面还是有小细节的,比如初始化数组的办法。
初始化数组
当数组a是bool类型,那么就是memset(a,false,sizeof(a));
当数组a是int类型,那么就是memset(a,0,sizeof(a));
二:传智杯的好题
这次传智杯的题目其实相对来说都比较简单,没有考太多的语法,只有第三题考的四舍五入函数还有向上取整函数,因为之前没有见到过,因此写起来一直在卡。还有就是第五题"击鼓传花",这个我写的时候一直在卡时间,也是现在才发现好的题解。
1.首先,先说一下向上取整和向下取整,四舍五入函数吧。参考下面这个文章
取整函数(ceil、floor、round)_做一只快乐的猿-优快云博客_ceil函数
2.击鼓传花题目:
这个题容易卡时间,看题解,然后自己理解,写出这个宝藏题解。
题解:
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int p[10000005];
int st[10000005];
int main()
{
cin>>n>>m>>k;
for(int i=1;i<=m;i++)
cin>>p[i];
for(int i=1;i<=m;i++)
for(int j=1;!st[p[i]];j++)
{
st[(p[i]+j*k)%n]=1;
}
int ans=0;
for(int i=0;i<n;i++)
{
if(st[i]==0)
ans++;
}
cout<<ans;
return 0;
}
这里用到线性筛,和它能放一起学的还有素数筛,欧拉筛。下面一篇博客将会学习和总结。加油加油加油!!
完结撒花!!!