哈尔滨理工大学软件学院 第六届院赛 高年级决赛 题解(更新中......)
来源:互联网 发布:tuneskit for windows 编辑:程序博客网 时间:2024/05/16 02:00
先总结下:本来能轻松搞6道,剩下的也都有点思路,结果却不是像自己想的这样。代码能力确实有点弱,思路不清晰的题只有两道,其他的思路还是比较清晰的,实现时细节问题非常重要,细节决定成败。继续努力,一直相信:毅力更重要,不能不学习,一天学一点点,用心去做,用心去学,收获或许来的比较晚,但是一定会有的。努力吧,蒟蒻。
A.读了半天没读懂题,nlogn的板子搞上去挂了5发,读了3遍题,猜出了一点东西,蒙对了,就是找这个序列中不一样的数的个数。
【AC代码】
#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<map>#include<vector>#include<stack>#include<algorithm>using namespace std;int a[100005];int main(){ int t,n; scanf("%d",&t); while(t--) { map<int,int> m; scanf("%d",&n); a[0]=1; int num,sum=0; for(int i=1;i<=n;i++) { scanf("%d",&num); if(!m[num]) { m[num]++; sum++; } } printf("%d\n",sum); } return 0;}
B.水题,直接计算就可以了。
#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<map>#include<vector>#include<stack>#include<algorithm>using namespace std;char a[200005];int main(){ int t; scanf("%d",&t); while(t--) { scanf("%s",a); int len=strlen(a),sum=0; for(int i=0;i<len;i++) { sum+=(a[i]-'A'+1); } printf("%d\n",sum); } return 0;}
C题:暴力求回文数的题目,下面的算法仅供参考,时间复杂度感觉还可。
#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<map>#include<vector>#include<stack>#include<algorithm>using namespace std;int main(){ int a[10]; for( a[1]=1; a[1]<=9; a[1]++) for( a[8]=0; a[8]<=9; a[8]++) { if(a[1]==a[8]) { for(a[2]=0;a[2]<=9;a[2]++) { for( a[7]=0;a[7]<=9;a[7]++) { if(a[2]==a[7]) { for( a[3]=0;a[3]<=9;a[3]++) { for(a[6]=0;a[6]<=9;a[6]++) { if(a[3]==a[6]) { for(a[4]=0;a[4]<=9;a[4]++) { for(a[5]=0;a[5]<=9;a[5]++) { if(a[4]==a[5]) { printf("%d%d%d%d%d%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8]); } } } } } } } } } } } return 0;}
D题:并查集+01背包。母鸡比赛时自己怎么了,然后一直卡,现在给个AC的代码。
【AC代码】
#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<map>#include<vector>#include<stack>#include<algorithm>using namespace std;int pre[10005];int fin(int x){ if(x==pre[x]) { return x; } else { return pre[x]=fin(pre[x]); }}int a[10005],b[10005];void join(int x,int y){ int t1=fin(x); int t2=fin(y); if(t1!=t2) { pre[t1]=t2; }}int dp[10005];int main(){ int n,m,c,t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&n,&m,&c); for(int i=2;i<=n;i++) { scanf("%d%d",&a[i],&b[i]); } for(int i=1;i<=n;i++) { pre[i]=i; } int u,v; for(int i=0;i<m;i++) { scanf("%d%d",&u,&v); join(u,v); } int pos=fin(1); memset(dp,0,sizeof(dp)); for(int i=2;i<=n;i++) { if(pos==fin(i)) { for(int j=500;j>=a[i];j--) { dp[j]=max(dp[j],dp[j-a[i]]+b[i]); } } } printf("%d\n",dp[c]); } return 0;}
F题:直接暴力,然后处理下极端数据就好了
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;char str[100050];int main(){ int t,sum; scanf("%d",&t); while(t--) { scanf("%s",str+1); int len=strlen(str+1); int a,b,c,d; sum=0; for(int i=1,j; i<=len; i++) { a=0; b=0; c=0; d=0; for(j=i; j<=len; j++) { if (str[j]=='L') a++; if (str[j]=='O') b++; if (str[j]=='V') c++; if (str[j]=='E') d++; if (a&&b&&c&&d) { break; } } if(j==len+1&&!(a&&b&&c&&d)) { break; } if(j<=len&&a&&b&&c&&d) sum=sum+len-j+1; } printf("%d\n",sum); } return 0;}
G题:一道爆搜的题目,有个细节需要注意一下:就是除了出口,其他点假如人和火同时到达是不能接着走的。
【AC代码】
#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<map>#include<vector>#include<stack>#include<algorithm>using namespace std;char a[50][50];int book1[50][50];int book2[50][50];int num[50][50];int n,m;int dir1[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};int dir2[4][2]={{0,1},{0,-1},{1,0},{-1,0}};struct node{ int x,y,step;};void bfs1(){ node fr,ne; queue<node>q; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(a[i][j]=='*') { fr.x=i,fr.y=j; fr.step=0; q.push(fr); } } } num[fr.x][fr.y]=0; while(!q.empty()) { fr=q.front(); q.pop(); for(int i=0;i<8;i++) { ne.x=fr.x+dir1[i][0]; ne.y=fr.y+dir1[i][1]; if(ne.x>=0&&ne.x<n&&ne.y>=0&&ne.y<m&&book1[ne.x][ne.y]==0) { book1[ne.x][ne.y]=1; ne.step=fr.step+1; num[ne.x][ne.y]=ne.step; q.push(ne); } } }}int bfs2(int sx,int sy,int ex,int ey){ node fr,ne; fr.x=sx,fr.y=sy; fr.step=0; queue<node>q; q.push(fr); book2[fr.x][fr.y]=1; while(!q.empty()) { fr=q.front(); q.pop(); if(fr.x==ex&&fr.y==ey) { return fr.step; } for(int i=0;i<4;i++) { ne.x=fr.x+dir2[i][0]; ne.y=fr.y+dir2[i][1]; ne.step=fr.step+1; if(ne.x>=0&&ne.x<n&&ne.y>=0&&ne.y<m&&book2[ne.x][ne.y]==0) { book2[ne.x][ne.y]=1; if(a[ne.x][ne.y]=='.') { if(ne.step>=num[ne.x][ne.y]) { continue; } else { book2[ne.x][ne.y]=1; q.push(ne); } } else if(a[ne.x][ne.y]=='E') { if(ne.step<=num[ne.x][ne.y]) q.push(ne); } } } } return -1;}int main(){ int t; scanf("%d",&t); while(t--) { int sx,sy,ex,ey; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%s",a[i]); } memset(book1,0,sizeof(book1)); memset(book2,0,sizeof(book2)); for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(a[i][j]=='#') { book2[i][j]=1; } if(a[i][j]=='S') { sx=i,sy=j; } else if(a[i][j]=='E') { ex=i,ey=j; } } } bfs1(); int re=bfs2(sx,sy,ex,ey); if(re==-1) { printf("T_T\n"); } else { printf("%d\n",re); } } return 0;}
H题:矩阵快速幂求斐波那契数列的第n项,当时带的模板就是这个题的,只是因为前面卡那两题卡的太严重,板子最后都没敲上。
【AC代码】
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;#define LL long longstruct Mat{ LL a[2][2]; void init() { memset(a,0,sizeof(a)); a[0][0]=1; a[1][1]=1; }};Mat mul(Mat a,Mat b){ Mat ans; ans.init(); for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { ans.a[i][j]=0; for(int k=0;k<2;k++) { ans.a[i][j]+=a.a[i][k]*b.a[k][j]; } ans.a[i][j]%=1000000007; } } return ans;}Mat power(Mat a,LL num){ Mat ans; ans.init(); while(num) { if(num&1) { ans=mul(ans,a); } num/=2; a=mul(a,a); } return ans;}int main(){ long long n; int t; scanf("%d",&t); while(t--) { scanf("%lld",&n); if(n==-1) { break; } if(n==0) { printf("0\n"); continue; } Mat a,ans; a.a[0][0]=1,a.a[0][1]=1,a.a[1][0]=1,a.a[1][1]=0; ans=power(a,n+1); printf("%lld\n",ans.a[1][0]%1000000007); }}
0 0
- 哈尔滨理工大学软件学院 第六届院赛 高年级决赛 题解(更新中......)
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛【部分题解】)
- 哈尔滨理工大学软件学院大一个人赛训练Round2 部分题解
- 哈尔滨理工大学第七届程序设计竞赛决赛 题解
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(水题5道)
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛)F Fibonacci Again
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛) D. Pairs
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛 F Fibonacci Again (矩阵快速幂)
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛) D. Pairs FFT
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛)A Golds 最大流
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛)
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛)C Coin dp
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛 A Golds(LCA + 最大流)
- 哈尔滨理工大学软件学院OJ 1419: 最大的XⅡ
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛【不断更新】
- Contest1086 - 哈尔滨理工大学软件学院ACM程序设计全国邀请赛
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛
- 进制转换 这错误了
- 浅谈 View 的 OnTouchEvent 和 OnTouchListener 的区别
- 计算二叉树的高度和结点数
- html5-Dom操作
- 树莓派VPN搭建
- 哈尔滨理工大学软件学院 第六届院赛 高年级决赛 题解(更新中......)
- 运营指标的拆解和落地——《互联网运营的知识体系与整体逻辑》笔记(十)
- 常用的数据库用户角色访问权限查询语句
- Macbook Pro下载并编译Android源码并导入Android Studio
- CSS3案例学习
- html5表单
- 看了极光推送技术原理的几点思考
- opencv图像全景拼接
- Html知识总结