主页 > 创业  > 

ACM---大一第三周周赛(Floyd算法+并查集算法学习周)

ACM---大一第三周周赛(Floyd算法+并查集算法学习周)

🚀write in front🚀 📝个人主页:认真写博客的夏目浅石.CSDN 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 📣系列专栏:ACM周训练题目合集.CSDN 💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊 ✉️为什么我们不知疲倦,因为我们都在做自己所热爱的事 ♐

文章目录 A - Color the ballB - SuitsC - 六度分离D - 无处不在的宗教E - 农场派对F - 怪物(简易版)G - 嫌疑犯比赛情况:总结


A - Color the ball

杭电—Color the ball 解题思路:考察差分数组,基础模板

#include<iostream> #include <cstring> using namespace std; int arr[100010]; int n,i; int main() { while(scanf("%d", &n), n!=0) { memset(arr, 0, sizeof(arr)); for(i=1;i<=n;i++) { int l,r; cin>>l>>r; arr[l]++; arr[r+1]--; } for(i=1;i<=n;i++) { arr[i]+=arr[i-1]; if(i!=n) { printf("%d ", arr[i]); } else printf("%d",arr[i]); } cout<<endl; } return 0; } B - Suits

洛谷—Suits 解题思路:数学问题,一直分类讨论就可以解了

#include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int a,b,c,d,e,f; typedef long long ll; ll m1,m2; ll mn=-1; int main() { cin>>a>>b>>c>>d>>e>>f; int max=0; int mn=min(a,d); int mx=min(c,d); if(e*mn+f*min(b,min(c,d-mn))>max) { max=e*mn+f*min(b,min(c,d-mn)); } if(e*min(a,d-min(b,mx))+f*min(b,mx)>max) { max=e*min(a,d-min(b,mx))+f*min(b,mx); } if(e*mn>max) { max=e*mn; } if(f*min(b,mx)>max) { max=f*min(b,mx); } cout<<max; return 0; } C - 六度分离

杭电—六度分离

#include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; #define inf 0x3f3f3f3f int g[101][101]; int n,m,ans; int main() { while(cin>>n>>m) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(i==j) g[i][j]=0; else g[i][j]=inf; } } while(m--) { int a,b; cin>>a>>b; g[a][b]=g[b][a]=1; } for(int k=0;k<n;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(g[i][j]>g[i][k]+g[k][j]) { g[i][j]=g[i][k]+g[k][j]; } } } } //以上全部是模板 int flag=0; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(g[i][j]>7) { puts("No"); flag=1; break; } } if(flag) break; } if(flag==0) puts("Yes"); } return 0; } D - 无处不在的宗教

POJ无处不在的宗教

//水题,竟然我也能AC.... #include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int n,m; int p[100010]; int find(int x) { return p[x]==x?x:(p[x]=find(p[x]));//算法模板 } int s=1; int main() { cin>>n>>m; again: int ans=0; for(int i=1;i<=n;i++) p[i]=i; while(m--) { int i,j; cin>>i>>j; i=find(i); j=find(j); if(i!=j) { p[i]=j;//模板 } } for(int i=1;i<=n;i++) { if(find(i)==i) { ans++; } } printf("Case %d: %d\n",s++,ans); cin>>n>>m; if(n==0&&m==0) return 0; else goto again; return 0; } E - 农场派对

#10075. 「一本通 3.2 练习 1」农场派对

#include<iostream> #include<algorithm> #include<cstring> using namespace std; #define inf 0x3f3f3f3f//结论,一个很大的数,适合这个算法的初始化 int n,m,x; long long g[1010][1010]; long long path[1010][1010]; int main() { int max=0; cin>>n>>m>>x; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) g[i][j]=0; else g[i][j]=inf; } } for(int i=1;i<=m;i++) { int a,b,t; cin>>a>>b>>t; g[a][b]=t; } for(int k=1;k<=n;k++) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(g[i][j]>g[i][k]+g[k][j]) { g[i][j]=g[i][k]+g[k][j]; } } } } //以上全部是算法模板 for(int i=1;i<=n;i++) { if(g[i][x]+g[x][i]>=max)//这里根据题目要求来写就对了,调试了一会儿AC了 { max=g[i][x]+g[x][i]; } } cout<<max<<endl; return 0; } F - 怪物(简易版)

A. Monsters (easy version)

#include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; typedef long long ll; ll t,n,arr[200010],i,j; int main() { cin>>t; while(t--) { ll cnt=0; cin>>n; for(i=1;i<=n;i++) cin>>arr[i]; sort(arr+1,arr+n+1); if(arr[1]!=1) { cnt+=arr[1]-1; arr[1]=1; } for(i=2;i<=n;i++) { if(arr[i]-arr[i-1]>=2) { cnt+=arr[i]-arr[i-1]-1; arr[i]=arr[i-1]+1; } } cout<<cnt<<endl; } return 0; } G - 嫌疑犯

The Suspects

#include<iostream> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int n,m,ans,k; int p[100010]; int a[100010]; int find(int x) { return p[x]==x?x:(p[x]=find(p[x]));//并查集的固定模板 } inline void he(int i,int j) { int x=find(i); int y=find(j); if(x<y)//这里意思是:让小的数做根节点,也是为了贴近题目要求 { p[y]=x; } else p[x]=y; } int main() { while(cin>>n>>m&&n||m) { ans=0; for(int i=0;i<n;i++) p[i]=i;//初始化 while(m--) { cin>>k; cin>>a[0];//合并 for(int i=1;i<k;i++) { cin>>a[i]; he(a[i],a[i-1]); } } for(int i=0;i<n;i++) { if(find(i)==0)//根据题意来求解。 { ans++; } } cout<<ans<<endl; } return 0; } 比赛情况:

大一第十(前面有个学长试水~),退步好多这一次,下面做一下这一周比赛的一个总结,以便于后面的学习。 表述题目难度以及做题时候的感想: A---临时加上去的,感觉学长们为了照顾那些爆0的同学加的,简单差分模板。

B---这个是我第二个做出来的,花费了我巨多时间,哭了,我的思维还是不够敏捷,需要多加练习思维题目,不然这种题目大家都拿到了,我还要花好多时间才能过,真的很难受的

C---没时间做,后面自己尝试了一下子,发现只要根据题目逻辑去写是完全套板子的问题,就是多加一点循环和判断的问题。

D---这个更加的板子,我一次可AC了,非常模板。

E---Floyd算法的板子题目,我第一个AC的这个题目,相对于板子,只需要加一点判断就可以了,简单。

F---没时间做,后面自己尝试了一下子,思维题,被我的好哥们讲懂了,我还是不擅长写思维题目,脑子很笨。

G---这个比赛的时候写了,but没写完全,就结束了,后面补了一下题,发现这个题目就是并的时候需要注意外,别的就是板子,害,我可能太笨了。

总结

心态:就是可能看到别人比我聪明,就心里非常难受,比赛的时候落后,心里更是难受,觉得算法好难学啊,好想退缩,但是算法迟早是要学习的,不如顶住压力,好好学,哪怕倒数第一,也要勇往直前,放平心态,继续加油夏目浅石。

学习方法:一定要学会思考,把每一周的题目自己独立思考至少30min后不会了再去看答案学习人家的思路,不然效率很低下。还有就是,昨完一定一定要总结模板和总结思路,总结题型!!!!!!!!!!!

时间安排:后续要晚上7-10点好好学习算法,到宿舍补一补学校课程,看看网课,学校课程能逃就逃,然后学点有用的。

虽然很苦难,但是还是要继续坚持下去。 激励一下自己吧,虽然挺难过的

标签:

ACM---大一第三周周赛(Floyd算法+并查集算法学习周)由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“ACM---大一第三周周赛(Floyd算法+并查集算法学习周)