1. 程式人生 > >冬訓day3 簡單數據結構

冬訓day3 簡單數據結構

5-0 ets window rain n! 用兩個 每次 tac mes

A - 簡單計算器

模擬加棧。。寫一寫就好,從頭到尾掃一遍,分兩個棧存,一個存運算符,一個存中間結果,遇到乘除就先處理了,每次遇到加減就處理上一個加減的兩個數,結果壓進去。。。同時把這個運算符存進去。最後再來個循環把運算符清完。。

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<stack>
 4 using namespace std;
 5 int main()
 6 {
 7    int i;
 8    double a,b;
 9    char s[250],c;
10    while
(gets(s),strcmp(s,"0")!=0) 11 { 12 stack<char>s1; 13 stack<double>s2; 14 for(i=0;s[i];i++) 15 { 16 if(s[i]>=0&&s[i]<=9) 17 { 18 a=0; 19 while(s[i]>=0&&s[i]<=9) 20 {
21 a=a*10+s[i]-0; 22 i++; 23 } 24 i--; 25 s2.push(a); 26 } 27 else if(s[i]==-||s[i]==+) 28 { 29 if(!s1.empty()) 30 { 31 c=s1.top();
32 s1.pop(); 33 a=s2.top(); 34 s2.pop(); 35 b=s2.top(); 36 s2.pop(); 37 if(c==+) 38 a+=b; 39 else 40 a=b-a; 41 s2.push(a); 42 s1.push(s[i]); 43 } 44 else 45 s1.push(s[i]); 46 } 47 else if(s[i]==/) 48 { 49 b=0; 50 i+=2; 51 while(s[i]>=0&&s[i]<=9) 52 { 53 b=b*10+s[i]-0; 54 i++; 55 } 56 i--; 57 a=s2.top(); 58 s2.pop(); 59 a=a/b; 60 s2.push(a); 61 } 62 else if(s[i]==*) 63 { 64 b=0; 65 i+=2; 66 while(s[i]>=0&&s[i]<=9) 67 { 68 b=b*10+s[i]-0; 69 i++; 70 } 71 i--; 72 a=s2.top(); 73 s2.pop(); 74 a=a*b; 75 s2.push(a); 76 } 77 } 78 while(!s1.empty()) 79 { 80 c=s1.top(); 81 s1.pop(); 82 a=s2.top(); 83 s2.pop(); 84 b=s2.top(); 85 s2.pop(); 86 if(c==+) 87 a+=b; 88 else 89 a=b-a; 90 s2.push(a); 91 } 92 printf("%.2f\n",s2.top()); 93 } 94 return 0; 95 }
View Code

B - ACboy needs your help again!

無腦隊列,棧,剛開始WA了一發是因為沒有清空棧隊列。。

C - Ugly Numbers

這個題我本來是寫掃一遍的算法。。但是那樣很明顯會超時,所以乘2,3,5?似乎可以拿優先隊列來寫……但我覺得用不著……

技術分享圖片
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 #define N 100000
 6 #define ll long long
 7 using namespace std;
 8 bool check(ll x)
 9 {
10     if(x<10&&x!=7) return false;
11     for(ll i=2;i<floor(sqrt((double)x));++i)
12       if(x%i==0) return false;
13       return true;
14 }
15 ll a[1505];
16 int main()
17 {  
18     ll t=1,q2=1,q3=1,q5=1;a[1]=1;
19     //for(int i=1;i<=6;++i) a[i]=i;
20     while(1)
21     {
22         int n;
23         scanf("%d",&n);
24         if(n==0) break;
25         while(t<n)
26         {
27             a[++t]=min(min(a[q2]*2,a[q3]*3),a[q5]*5);
28             if(a[t]==a[q2]*2) q2++;
29             if(a[t]==a[q3]*3) q3++;
30             if(a[t]==a[q5]*5) q5++;
31         }
32         printf("%lld\n",a[n]);
33     }
34     return 0;
35 }
View Code

D - Rails

題目意思是給定一個火車出站序列,問能不能實現,由於其後進後出的模式,自然用棧。每次一個火車進站,都去看一看現在棧頂的火車能不能對的上當前應該出站的火車序號,能對的上就pop,最後全部push進去後,如果棧沒空,則無法實現。簡單的棧應用。

WA了兩發是因為讀入寫殘了emmmm

E - Black Box

這個題是要在向一個序列中添加元素的時候,輸出第i小的數,是在輸入過程中進行排序,用sort大概會炸吧。。其實用兩個優先隊列可以解決,一個存前i個數,大根堆,另一個小根堆存後面的數,這樣可以保證大根堆的頂存的就是第i個小的數;

註意優先隊列的寫法。。orz

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<vector>
 6 #include<queue>
 7 #include<stack>
 8 #include<algorithm>
 9 #define N 100000
10 #define ll long long
11 using namespace std;
12 priority_queue<int,vector<int>,less<int> >q1;
13 priority_queue<int,vector<int>,greater<int> >q2;
14 int a[30005],b[30005];
15 void sock(int d)
16 {
17     while(q1.size()>d) {
18         q2.push(q1.top());q1.pop();
19     }
20     while(q1.size()<d)
21     {
22         q1.push(q2.top());q2.pop();
23     }
24 }
25 void add1(int x)
26 {
27     if(q1.empty()){  q1.push(x);return;
28     } 
29     if(x>q1.top()) q2.push(x);
30     else q1.push(x);
31 }
32 int main()
33 {
34     int n,m;
35     cin>>n>>m;
36     for(int i=1;i<=n;++i) scanf("%d",&a[i]);
37     for(int i=1;i<=m;++i) scanf("%d",&b[i]);
38     int k=0,get=1;
39     for(int i=1;i<=n;++i)
40     {
41         add1(a[i]);
42         while(b[get]==i&&get<=m)
43         {
44             get++;k++;
45             sock(k);
46             cout<<q1.top()<<endl;
47         }
48     }
49 }
View Code

F - Fence Repair

emmmme就是一個合並果子嘛。。剛開始想的鬼畜算法WA了,

G - Running Median

和E是一個道理,但是比E簡單一點,因為只要求中位數就行了。。基本固定吧,

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<vector>
 6 #include<queue>
 7 #include<stack>
 8 #include<algorithm>
 9 #define N 100000
10 #define ll long long
11 using namespace std;
12 priority_queue<int,vector<int>,greater<int> > qa;//小根堆存比中位數大的數 
13 priority_queue<int,vector<int>,less<int> > qb;//大根堆存小於中位數的數 
14 void add(int x)
15 {
16     if(qa.empty())
17     {
18         qa.push(x);return;
19      } 
20     if(x>qa.top()) qa.push(x);
21     else qb.push(x);
22     while(qa.size()<qb.size()) 
23     {
24         qa.push(qb.top());qb.pop();
25     }
26     while(qa.size()>qb.size()+1)
27     {
28         qb.push(qa.top());qa.pop();
29     }
30 }
31 int a[10000];
32 int main()
33 {
34     int T,index,n,x;
35     cin>>T;
36     while(T--)
37     {
38         while(!qa.empty()) qa.pop();
39         while(!qb.empty()) qb.pop();
40         int t=0;
41         scanf("%d %d",&index,&n);
42         for(int i=1;i<=n;++i) 
43         {
44             scanf("%d",&x);
45             add(x);
46             if(i%2) a[++t]=qa.top();
47         }
48         printf("%d %d\n",index,(n+1)/2);
49         for(int i=1;i<=t;++i)
50         {
51            printf("%d",a[i]);
52            if(i>0&&i%10==0) printf("\n");
53            if(i%10) printf(" ");
54         }
55         if(t%10) printf("\n");
56     }
57 }
View Code

J - Train Problem I

和D一個道理,多了一個標記。

K - 看病要排隊

顯然優先隊列,優先隊列中對於結構體需要自己手寫重載。。我還是寫帶有友元函數的重載吧。。。總結裏寫

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<vector>
 6 #include<queue>
 7 #include<stack>
 8 #include<algorithm>
 9 #define N 100000
10 #define ll long long
11 using namespace std;
12 struct patient{
13     int cla,id;
14     bool operator < (const patient& p1) const
15     {
16         if(cla!=p1.cla) return cla<p1.cla;
17         else return id>p1.id;
18     }
19 };
20 int main()
21 {
22     int n;string comm;
23     while(~scanf("%d",&n))
24     {
25         priority_queue<patient>doctor[4];
26         int id=1;
27         for(int i=1;i<=n;++i)
28 {
29         cin>>comm;
30         if(comm=="IN")
31         {
32             int x,y;
33             scanf("%d%d",&x,&y);
34             patient p1;
35             p1.cla=y;p1.id=id;
36             id++;
37             doctor[x].push(p1);
38         }
39         else
40         {
41             int x;
42             scanf("%d",&x);
43             if(doctor[x].empty()) printf("EMPTY\n");
44             else 
45             {
46                 printf("%d\n",doctor[x].top().id);
47                 doctor[x].pop();
48             }
49         }
50     }
51 }
52 }
View Code

L - Team Queue

這個題用到了圖啊。而我一點沒想?WA一發是初始化出現了問題

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<vector>
 6 #include<queue>
 7 #include<stack>
 8 #include<algorithm>
 9 #include<map>
10 #define N 100000
11 #define ll long long
12 using namespace std;
13 int main()
14 {
15     int t,cas=1;
16     while(cin>>t&&t)
17     {
18         int n,x;
19         queue<int> q1,q2[1010];
20         while(!q1.empty()) q1.pop();
21         for(int i=0;i<1010;++i) 
22         {
23             while(!q2[i].empty()) q2[i].pop();
24         }
25         cout<<"Scenario #"<<cas++<<endl;
26         map<int,int> team;
27         for(int i=0;i<t;++i)
28         {
29             cin>>n;
30             while(n--)
31             {
32                 cin>>x;team[x]=i;
33             }
34         }
35         string s;
36         for(;;)
37         {
38             cin>>s;
39             if(s[0]==S) break;
40             else if(s[0]==D)
41             {
42                 int hh=q1.front();
43                 cout<<q2[hh].front()<<endl;
44                 q2[hh].pop();
45                 if(q2[hh].empty()) q1.pop();
46             }
47             else if(s[0]==E)
48             {
49                 cin>>x;
50                 int hh=team[x];
51                 if(q2[hh].empty()) q1.push(hh);
52                 q2[hh].push(x);
53             }
54         }
55         cout<<endl;
56     }
57 }
View Code

M - Windows Message Queue

和K差不多吧。。WA一發是因為ID寫錯了。。

技術分享圖片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<vector>
 6 #include<queue>
 7 #include<stack>
 8 #include<algorithm>
 9 #define N 100000
10 #define ll long long
11 using namespace std;
12 struct Msg{
13     string name;
14     int pa,pr,id;
15     friend bool operator < (Msg p1,Msg p2)
16     {
17         if(p1.pr!=p2.pr) return p1.pr>p2.pr;
18         else return p1.id>p2.id;
19     }
20 };
21 priority_queue<Msg> msg;
22 int main()
23 {
24     string s;
25     int id=1;
26     while(cin>>s)
27     {
28         if(s=="GET")
29         {
30             if(msg.empty()) printf("EMPTY QUEUE!\n");
31             else 
32             {
33                 cout<<msg.top().name<<" "<<msg.top().pa<<endl;
34                 msg.pop();
35             }
36         }
37         else
38         {
39             Msg p;
40             cin>>p.name>>p.pa>>p.pr;
41             p.id=id++;
42             msg.push(p);
43         }
44     }
45 }
View Code

冬訓day3 簡單數據結構