从头开始刷ACM,真的发现过去的很多漏洞,特别越是基础的数据结构,越应该学习得精,无论是ACM竞赛,研究生考试,还是工程上,对这些基础数据结构的应用都非常多,深刻理解非常必要。不得不说最近感触还是比较多,申请阿里的校招挂了,申请的是算法工程师。然而得到的答复是第一,几乎只招研究生,本科生被Pass掉了,然后第二,问我是否有读研的打算,我说有,然后吐槽我的ACM搞得像屎一样,成绩根本无法让他满意,如果有意向,建议我能研一能拿个像样的成绩,真是2333。自己弱也怪不得别人了。
训练地址:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=84416#overview
uva679
好吧,先贴一道大水题,自习室做得。
链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=620
ps:白书上代码是超时的,真是个坑
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<vector> 6 using namespace std; 7 int T; 8 int main() 9 { 10 while(cin>>T) 11 { 12 if(T==-1) 13 break; 14 while(T--) 15 { 16 int d,l,k; 17 cin>>d>>l; 18 k=1; 19 for(int i=1;i<d;i++) 20 { 21 if(l%2) 22 { 23 l=l-l/2; 24 k=k*2; 25 } 26 else 27 { 28 l=l/2; 29 k=k*2+1; 30 } 31 } 32 cout<<k<<endl; 33 } 34 35 } 36 return 0; 37 }
uva122
白书上的一道例题,第一棵二叉树,建树,bfs遍历
链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=58
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<vector> 7 #include<queue> 8 #include<cstdlib> 9 #include<cctype> 10 using namespace std; 11 const int maxn=1000; 12 char s[maxn+10]; 13 int failed=0; 14 //结点类型 15 typedef struct Tnode 16 { 17 int have_value; //是否被赋值过 18 int v; //结点值 19 struct Tnode *left,*right; 20 }Node; 21 Node* root; 22 23 Node* newnode() 24 { 25 Node* u=(Node*)malloc(sizeof(Node)); //申请动态内存 26 if(u!=NULL) //若申请成功 27 { 28 u->have_value=0; //初始化为0 29 u->left=u->right=NULL; //初始化没有左右儿子 30 } 31 return u; 32 } 33 34 void addnode(int v,char *s) 35 { 36 int n=strlen(s); 37 Node* u=root; //从根结点开始往下走 38 for(int i=0;i<n;i++) 39 if(s[i]=='L') 40 { 41 if(u->left==NULL) u->left=newnode(); //结点不存在,建立新结点 42 u=u->left; //往左走 43 } 44 else if(s[i]=='R') 45 { 46 if(u->right==NULL) u->right=newnode(); 47 u=u->right; 48 } //忽略其他情况,即最后那个多余的右括号 49 if(u->have_value) failed=1; //已经赋值,表示输入有误 50 u->v=v; 51 u->have_value=1; //做标记 52 } 53 54 void remove_tree(Node* u) 55 { 56 if(u==NULL) return; //提前判断比较稳妥 57 remove_tree(u->left); //递归释放左子树 58 remove_tree(u->right); //递归释放右子树 59 free(u); //释放u本身 60 } 61 62 int read_input() //保存读入结点 63 { 64 failed=0; 65 remove_tree(root); //释放一棵二叉树 66 root=newnode(); //创建跟结点 67 for(;;) 68 { 69 if(scanf("%s",s)!=1) return 0; //整个输入结束 70 if(!strcmp(s,"()")) break; //结束标志 71 int v; 72 sscanf(&s[1],"%d",&v); //读入结点值 73 addnode(v,strchr(s,',')+1); //查找逗号,然后插入结点 74 } 75 return 1; 76 } 77 78 int n=0,ans[maxn]; 79 int bfs() 80 { 81 int front=0,rear=1; 82 Node* q[maxn]; 83 q[0]=root; 84 while(front<rear) 85 { 86 Node* u=q[front++]; 87 if(!u->have_value) return 0; 88 ans[n++]=u->v; 89 if(u->left!=NULL) q[rear++]=u->left; 90 if(u->right!=NULL) q[rear++]=u->right; 91 } 92 return 1; 93 } 94 95 void print() 96 { 97 for(int i=0;i<n;i++) 98 { 99 if(i) printf(" "); 100 printf("%d",ans[i]); 101 } 102 printf(" "); 103 n=0; 104 } 105 int main() 106 { 107 while(read_input()) 108 { 109 if(failed||!bfs()) cout<<"not complete"<<endl; 110 else print(); 111 } 112 return 0; 113 }
一个简单的知识点,今天复习数据结构教材的时候写的,已经前序跟中序,打印后序遍历
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<cmath> 6 #include<vector> 7 #include<string> 8 #include<stack> 9 using namespace std; 10 const int maxn=1000+10; 11 void build(int n,char* s1,char* s2,char* s) 12 { 13 if(n<=0) return; 14 int p=strchr(s2,s1[0])-s2; 15 build(p,s1+1,s2,s); //后序遍历左子树 16 build(n-p-1,s1+p+1,s2+p+1,s+p); //后序遍历右子树 17 s[n-1]=s1[0]; 18 } 19 int main() 20 { 21 char s1[maxn],s2[maxn],s[maxn]; 22 while(scanf("%s%s",s1,s2)==2) 23 { 24 int n=strlen(s1); 25 build(n,s1,s2,s); 26 s[n]='