1、約瑟夫問題
#include<bits/stdc++.h>
using namespace std;
const int N=25;
int e[N],ne[N],head=-1,idx=1;
int n,m;
void add_to_head(int x){e[idx]=x;ne[idx]=head;head=idx++;
}
void add(int k,int x){e[idx]=x;ne[idx]=ne[k];ne[k]=idx++;
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){if(i==1){add_to_head(i);}else{add(i-1,i);}}ne[n]=head;int cur=head;while(n--){for(int i=1;i<m-1;i++){cur=ne[cur];}cout<<e[ne[cur]]<<" ";ne[cur]=ne[ne[cur]];cur=ne[cur];}return 0;
}
#include<iostream>
#include<queue>
using namespace std;
int n,m;
int main(){cin>>n>>m;queue<int>q;for(int i=1;i<=n;i++){q.push(i);}int i=1;while(!q.empty()){if(i==m){cout<<q.front()<<" ";q.pop();i=1;}else{q.push(q.front());q.pop();i=i+1;}}return 0;
}
2、單鏈表的創建,銷毀與遍歷
#include <iostream>
using namespace std;struct Node {int data;Node* next;
};int main() {Node* head = NULL;int num;// 逆序創建鏈表while (cin >> num && num != -1) {Node* newNode = new Node;newNode->data = num;newNode->next = head;head = newNode;}// 遍歷鏈表輸出Node* cur = head;while (cur != NULL) {cout << cur->data;if (cur->next != NULL) cout << " ";cur = cur->next;}cout << endl;// 銷毀鏈表while (head != NULL) {Node* temp = head;head = head->next;delete temp;}return 0;
}
3、最大子段和
#include<bits/stdc++.h>
using namespace std;int main() {int n;cin >> n;int a[105]; for (int i = 1; i <= n; i++) {cin >> a[i];}int dq_max = a[1]; int qj_max = a[1];for (int i = 2; i <= n; i++) {dq_max = max(a[i], dq_max + a[i]);qj_max = max(qj_max, dq_max);}cout << qj_max << endl;return 0;
}
4、求二叉樹的高度
#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node{int data;int left;int right;
}a[N];
int n;
int dfs(int root){if(root==0)return 0;int h1=dfs(a[root].left);int h2=dfs(a[root].right);return max(h1,h2)+1;
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i].data>>a[i].left>>a[i].right;}cout<<dfs(1);return 0;
}
5、二叉樹的遍歷
#include<bits/stdc++.h>
using namespace std;
const int N=105;
struct node{int left;int right;
}a[N];
int n;
void inorder(int root){if(root==0)return;cout<<root<<" ";inorder(a[root].left);inorder(a[root].right);
}
int main(){cin>>n;for(int i=1;i<=n;i++){cin>>a[i].left>>a[i].right;}inorder(1);return 0;
}
6、完全二叉樹的權值
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N];
int n,x;
int main(){int h=0,nn=0;cin>>n;for(int i=1;i<=n;i++){if(i>nn){nn+=pow(2,h);h++;}cin>>x;a[h]+=x;}int max_a=0,maxh=0;for(int i=1;i<=h;i++){if(a[i]>max_a){max_a=a[i];maxh=i;}}cout<<maxh<<endl;return 0;
}
7、二叉樹求值
#include<bits/stdc++.h>
using namespace std;
const int N = 105; // 題目限制n≤100struct Node {int value; // 節點權值int left, right; // 左右子節點編號int count; // 子樹節點個數int sum; // 子樹權值和
};Node nodes[N];// 遞歸計算以u為根的子樹的節點個數和權值和
void dfs(int u) {if (u == 0) return; // 空節點// 遞歸處理左右子樹dfs(nodes[u].left);dfs(nodes[u].right);// 計算當前子樹的節點個數和權值和nodes[u].count = 1; // 自身nodes[u].sum = nodes[u].value;if (nodes[u].left != 0) {nodes[u].count += nodes[nodes[u].left].count;nodes[u].sum += nodes[nodes[u].left].sum;}if (nodes[u].right != 0) {nodes[u].count += nodes[nodes[u].right].count;nodes[u].sum += nodes[nodes[u].right].sum;}
}int main() {int n;cin >> n;// 讀取每個節點的信息for (int i = 1; i <= n; i++) {cin >> nodes[i].value >> nodes[i].left >> nodes[i].right;nodes[i].count = 0;nodes[i].sum = 0;}// 從根節點開始遞歸計算(假設根節點是1)dfs(1);// 輸出每個節點的子樹信息for (int i = 1; i <= n; i++) {cout << nodes[i].count << " " << nodes[i].sum << endl;}return 0;
}
8、最大連續子序列
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int a[N];
int b[N];
int n;
int main(){cin>>n;for(int i=1;i<+n;i++){cin>>a[i];}int t=0;for(int i=1;i<=n;i++){if(a[i]>=0){t=1;break;}}if(t==0){cout<<a[1]<<" "<<a[n];}b[1]=a[1];int max=b[1],begin=0,end=0;for(int i=1;i<n;i++){if(b[i-1]<0){b[i]=a[i];}else{b[i]=b[i-1]+a[i];}if(b[i]>max){max=b[i];end=i;}}for(begin=end;begin>=0;begin--){if(b[begin<0]){break;}}begin++;cout<<max<<endl;return 0;
}
9、單鏈表基本操作
#include<bits/stdc++.h>
using namespace std;
struct node{int data;node* next;
};
int n;
int main(){cin>>n;node* head=NULL;node* tail=NULL;//構建初始鏈表for(int i=1;i<=n;i++){int v;cin>>v;node* newnode=new node{v};if(!head){head=tail=newnode;}else{tail->next=newnode;tail=newnode;}}int m;cin>>m;//處理操作for(int i=1;i<=m;i++){int op,k;cin>>op>>k;if(op==0){int d;cin>>d;if(k==0){node* newnode=new node{d};newnode->next=head;head=newnode;if(!tail){tail=newnode;}}else{node* curr=head;for(int j=1;j<k&&curr;j++){curr=curr->next;}if(curr){node* newnode=new node{d};newnode->next=curr->next;curr->next=newnode;if(tail==curr){tail=newnode;}}}}else if(op==1){if(k==0)continue;if(k==1){if(head){node* tmp=head;head=head->next;if(!head)tail=NULL;delete tmp;}}else{node* p=head;for(int j=1;j<k-1&&p;j++){p=p->next;}if(p&&p->next){node* t=p->next;p->next=t->next;if(t==tail) tail=p; // 修正:更新尾指針delete t; }}}}//輸出鏈表node* curr=head;while(curr){cout<<curr->data<<" ";curr=curr->next;}cout<<endl;//釋放內存while(head){node* tmp=head;head=head->next;delete tmp;}return 0;
}