这两周因为过年的原因训练的时间相对来说少了一些,但是codeforces上的比赛并没有落下,也补了以前的一些习题。寒假已经过去了一大半,总的来说进步自我感觉还是有的,特别是对以前不熟悉的算法加深了理解,运用上也更加流畅了起来。在学校的时候因为有课很少打cf上的比赛,害怕影响第二天的学习。寒假在家里倒是没这方面的担心,cf的分数增长了很多。事后在cf上补了一些习题。我参加的都是CF上的div3和div2的,感觉div2的打着还是比较难的,div3的感觉对我来说更加友好一些。要想进步的话还是要多打div2的比赛。前天的比赛能补的题目都补了,其中有一道最短路的题,我数值怎么都没有调整好就放弃了,感觉对我有点偏难了。也有道题例子过的比较艰难,挺折磨人的。
7-2 地下迷宫探索
这道题就是典型的dfs,我写的时候对最后的输出路径没有理解其意思,导致最后两个例子一直没有过,后来自己弄了例子测试的,才找到了问题点:没有把返回的路径给记录上,需要在dfs(i)
下面用vector存储。
include<bits/stdc++.h>
using namespace std;
int s[1005][1005],vis[10005],num=1;
vector
int n,m,q;
void dfs(int x){
ve.push_back(x);
for(int i=1;i<=n;i++){
if(vis[i]0&&s[x][i]1){
//ve.push_back(i);
vis[i]=1;
num++;
dfs(i);
ve.push_back(x);
}
}
}
int main(){
cin>>n>>m>>q;
for(int i=1;i<=m;i++){
int a,b;
cin>>a>>b;
s[a][b]=1;
s[b][a]=1;
}
vis[q]=1;
//ve.push_back(q);
dfs(q);
if(num==n){
for(int i=0;i<ve.size()-1;i++)
cout<<ve[i]<<' ';
cout<<ve[ve.size()-1];
}
else
{
for(int i=0;i<ve.size();i++)
cout<<ve[i]<<' ';
cout<<'0';
}
}
7-15 梯云纵
这道题贪心的比较艰难,需要计算很多麻烦的数值才能找到其规律性,当时做这道题时其实是知道肯定会用到贪心的,当时计算数值时就差最后五分钟了,真的是差一点就能把这道题解决了,还是挺遗憾的。
7-6 家庭房产
这个题思路比较简单,但是写起来还是很复杂的,就是在这道题上浪费了大量的时间,最后写了90多行代码,一提交就对一个例子。就是用并查集,然后用结构体来存储,不同的功能要用不同的函数分别实现,放在一起写很容易让人搞得头晕。
include <bits/stdc++.h>
using namespace std;
int fa[10050];
set
struct people
{
int rooms;
double S;
} head[10050];
struct answer
{
int minid;
int num;
int rooms;
double S;
};
map<int, answer> mp;
void init()
{
for (int i = 0; i < 10050; i++)
fa[i] = i;
}
int Find(int a)
{
if (fa[a] == a)
return a;
else
return fa[a] = Find(fa[a]);
}
void Union(int a, int b)
{
int f1 = Find(a);
int f2 = Find(b);
if (f1 < f2)
fa[f2] = f1;
else
fa[f1] = f2;
}
bool cmp(answer &a1, answer &a2)
{
if (a1.S / a1.num == a2.S / a2.num)
return a1.minid < a2.minid;
return a1.S / a1.num > a2.S / a2.num;
}
void test()
{
init();
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int id, p1, p2, knum, k;
cin >> id >> p1 >> p2 >> knum;
peo.insert(id);
if (p1 != -1)
{
peo.insert(p1);
Union(id, p1);
}
if (p2 != -1)
{
peo.insert(p2);
Union(id, p2);
}
for (int j = 0; j < knum; j++)
{
cin >> k;
peo.insert(k);//记录所有编号
Union(id, k);
}
cin >> head[id].rooms >> head[id].S;
}
for (int i : peo)
{
int id = Find(i);
mp[id].minid = id;
mp[id].num++;
mp[id].S += head[i].S;
mp[id].rooms += head[i].rooms;
}
cout << mp.size() << endl;
vector<answer> res;
for (auto i : mp)
{
res.push_back(i.second);
}
sort(res.begin(), res.end(), cmp);
for (auto i : res)
printf("%04d %d %.3lf %.3lf\n", i.minid, i.num, 1.0 * i.rooms / i.num, 1.0 * i.S / i.num);
}
int main()
{
test();
return 0;
}
附上90多行的错误代码。。。
include<bits/stdc++.h>
using namespace std;
struct pe{
int sum=1e5;
double ar,num;
int yu;
}s[1005];
bool compare(struct pe a,struct pe b){
if(a.ar!=b.ar)
return a.ar>b.ar;
else
a.sum<b.sum;
}
int y[100005];
int main(){
int n,jk=1;
cin>>n;
while(n--){
int n,m,q,j,mm=0,rt;
cin>>n>>m>>q>>j;
int u[j+5];
if(y[n]!=0)
rt=y[n];
else
mm++;
if(y[m]!=0&&m>0)
rt=y[m];
else
mm++;
if(y[q]!=0&&q>0)
rt=y[q];
else
mm++;
for(int i=1;i<=j;i++){
cin>>u[i];
if(y[u[i]]0)
mm++;
else
{
rt=y[u[i]];
break;
}
}
int o,p;
cin>>o>>p;
if(mmj+3){
y[n]=jk;
s[jk].sum=min(n,s[jk].sum);
s[jk].yu+=1+j;
if(m>0)
s[jk].sum=min(m,s[jk].sum),y[m]=jk,s[jk].yu++;
if(q>0)
s[jk].sum=min(q,s[jk].sum),y[q]=jk,s[jk].yu++;
for(int i=1;i<=j;i++)
s[jk].sum=min(u[i],s[jk].sum),y[u[i]]=jk;
s[jk].ar+=p;
s[jk].num+=o;
jk++;
}
else{
if(y[n]0)
{
y[n]=rt;
s[rt].yu++;
s[rt].sum=min(s[rt].sum,n);
}
if(y[m]0&&m>0){
y[m]=rt;
s[rt].yu++;
s[rt].sum=min(s[rt].sum,m);
}
if(y[q]0&&q>0){
y[q]=rt;
s[rt].yu++;
s[rt].sum=min(s[rt].sum,q);
}
for(int i=1;i<=j;i++){
if(y[u[i]]0){
y[u[i]]=rt;
s[rt].yu++;
s[rt].sum=min(s[rt].sum,u[i]);
}
}
}
}
for(int i=1;i<jk;i++){
s[i].ar/=s[i].yu;
s[i].num/=s[i].yu;
}
sort(s+1,s+jk,compare);
cout<<jk-1<<'\n';
for(int i=1;i<jk;i++)
cout<<s[i].sum<<' '<<s[i].yu<<' '<<s[i].num<<' '<<s[i].ar<<'\n';
}