天天快樂程式設計集訓隊2021暑假訓練-0810-資料結構題解
阿新 • • 發佈:2021-08-10
1.1214: 資料結構練習題――線性表操作
對陣列的相關操作
1.insert(插入)將要插入位置後的資料後移,並將當前賦值,長度+1
2.clear(清空),長度變為1
3.getelem(得到當前元素),直接下標訪問
4.delete(刪除),位置後的資料前移,長度-1
5.exit(退出),做為迴圈結束條件
#include <bits/stdc++.h> using namespace std; int a[1005]; int main() { //注意本題位置從1開始,所以這裡初始化為1 int tot=1; string s; while(cin>>s,s!="exit") { if(s=="insert") { int n; cin>>n; while(n--) { int pos,x; cin>>pos>>x; //倒著 for(int i=tot-1;i>=pos;i--) { //當前的挪到後面 a[i+1]=a[i]; } a[pos]=x; tot++; } } if(s=="getelem") { int pos; cin>>pos; cout<<a[pos]<<"\n"; } if(s=="clear") { //注意本題位置從1開始,所以這裡初始化為1 tot=1; } if(s=="delete") { int pos; cin>>pos; cout<<a[pos]<<"\n"; //正著 for(int i=pos;i<tot;i++) { //後一個為當前的 a[i]=a[i+1]; } tot--; } } return 0; }
2.1218: 資料結構練習題――棧
1.push(壓入),把這個數字放入最後一個數後
2.top(頂),取出top-1這個數
3.pop(彈出),取出top-1,並把top減1
4.清空,把top置為0
#include <bits/stdc++.h> using namespace std; int a[1005]; int main() { int top=0; string s; while(cin>>s,s!="exit") { if(s=="push") { int x; cin>>x; a[top++]=x; } if(s=="top") { if(top == 0) cout<<"None\n"; else cout<<a[top - 1]<<"\n"; } if(s=="pop") { if(top==0) cout<<"None\n"; else cout<<a[--top]<<"\n"; } if(s=="clear")top=0; } return 0; }
3.5487: 棧之應用
模擬下棧操作,每次都入棧,看待是否出棧
#include <bits/stdc++.h> using namespace std; int main() { int n; while(cin>>n) { string a,b; cin>>a>>b; //儲存答案序列 string ans=""; char st[10]; int top=0; //初始化,均要進棧 for(int i=0,j=0;i<n&&j<n;i++) { //a[i]進棧 st[top++]=a[i]; ans+="in\n"; //棧有元素,去匹配 while(top>0) { if(b[j]==st[top-1]) { j++,top--; ans+="out\n"; } else break; } } if(top>0)cout<<"No.\n"; else cout<<"Yes.\n"<<ans; cout<<"FINISH"<<"\n"; } return 0; }
4.4368: 資料結構練習題----佇列的基本操作
1.設定隊首和隊尾
2.入隊,插入到最後一個元素後面
3.出隊,把佇列第一個元素刪除
#include<bits/stdc++.h>
using namespace std;
int front,tail;
int q[1005];
int main()
{
string s;
while(cin>>s)
{
if(s=="exit")break;
if(s=="enq")
{
int x;
cin>>x;
q[tail++]=x;
}
if(s=="deq")
{
if(front>=tail)
{
cout<<"None\n";
continue;
}
cout<<q[front++]<<"\n";
}
if(s=="printq")
{
if(front>=tail)
{
cout<<"None\n";
continue;
}
cout<<q[front];
for(int i=front+1;i<tail;i++)cout<<' '<<q[i];
cout<<"\n";
}
}
return 0;
}
5.2936: 小孩報數問題
6.6173: 相同行程查詢
結構體勉強可以過,這裡建議排序後二分
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
struct T{
string c;
int r;
ll s[1005];
int num;
}a[105];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i].c>>a[i].r;
for(int j=0;j<a[i].r;j++)cin>>a[i].s[j];
a[i].num=0;
}
int k;
cin>>k;
while(k--)
{
ll id;
cin>>id;
for(int i=0;i<n;i++)
{
int flag=0;
for(int j=0;j<a[i].r;j++)
{
if(a[i].s[j]==id)
{
a[i].num+=1;
flag=1;
break;
}
}
if(flag)break;
}
}
int q;
cin>>q;
while(q--)
{
string x;
cin>>x;
int flag1=1;
for(int i=0;i<n;i++)
{
if(a[i].c==x)
{
cout<<a[i].num<<endl;
flag1=0;
}
}
if(flag1)cout<<"0"<<endl;
}
return 0;
}
二分程式碼
#include <bits/stdc++.h>
using namespace std;
struct xtxc{
string s1;
int t;
string s[1005];
int num;
}l[105];
//定義一個struct陣列,儲存所有的人
struct person{
string name;
string train;
}p[100005];
//寫排序函式
int cmp(person a,person b)
{
//按照name的字典序排列
return a.name<b.name;
}
string bs(int left, int right,string x){
int mid=(left+right)/2;
if(p[mid].name==x)
{
return p[mid].train;
}
else if(p[mid].name<x)
return bs(mid+1,right,x);
else
return bs(left,mid-1,x);
}
int main()
{
ios::sync_with_stdio(false);
//定義變數tot去儲存所有的人
int tot=0;
int n1, n2, n3;
cin>>n1;
for(int i=0;i<n1;i++)
{
cin>>l[i].s1>>l[i].t;
for(int j=0;j<l[i].t;j++)
{
cin>>l[i].s[j];
p[tot].name = l[i].s[j];
p[tot].train = l[i].s1;
tot++;
}
l[i].num=0;
}
//想要二分必須先有序
sort(p,p+tot,cmp);
cin>>n2;
//b和c之後並不需要,我們可以不用陣列,比如直接用x
string x;
for(int i=0;i<n2;i++)
{
cin>>x;
//先進行搜尋,搜尋返回下標或者train均可
string train = bs(0,tot,x);
//n1很小,可以直接遍歷
for(int j=0;j<n1;j++)
{
if(train==l[j].s1)
{
l[j].num++;
}
}
}
cin>>n3;
for(int i=0;i<n3;i++)
{
cin>>x;
int flag=0;
for(int j=0;j<n1;j++)
{
if(x==l[j].s1)
{
cout<<l[j].num<<endl;
flag=1;
break;
}
}
//沒被標記就是沒有
if(flag==0)
cout<<"0"<<endl;
}
}
大佬您太強了,還請多多指教哎