紫书第5章 C++STL

例题

 

例题5-1 大理石在哪儿(Where is the Marble?,Uva 10474)

主要是熟悉一下sort和lower_bound的用法

关于lower_bound:

http://blog.csdn.net/niushuai666/article/details/6734403

此外还有upper_bound

http://blog.csdn.net/niushuai666/article/details/6734650

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <cctype>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long

int a[10005];

int main()
{
     int n,q,i,x,cnt=1;
     while(~sf("%d%d",&n,&q) && n)
     {
          pf("CASE# %d:\n",cnt++);
          for(i=0;i<n;i++) sf("%d",&a[i]);
          sort(a,a+n);
          while(q--)
          {
               sf("%d",&x);
               int p = lower_bound(a,a+n,x)-a;
               if(a[p]!=x)
               {
                    pf("%d not found\n",x);
                    continue;
               }
               else
                    pf("%d found at %d\n",x,p+1);
          }
     }
}

 

例题5-2 木块问题(The Blocks Problem,Uva 101)

主要是熟悉vector的pb和resize,以及字符串结束的处理方法

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <cctype>
#include <vector>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long

vector<int> pile[30];
int n;

void find_block(int x,int &p,int &h)
{
     for(p=0;p<n;p++)
     {
          for(h=0;h<pile[p].size();h++)
          {
               if(pile[p][h] == x) return;
          }
     }
}

void clear_block(int p,int h)
{
     int i;
     for(i = h+1;i<pile[p].size();i++)
     {
          int b = pile[p][i];
          pile[b].pb(b);
     }
     pile[p].resize(h+1);
}

void onto_block(int p,int h,int p2)
{
     int i;
     for(i = h;i<pile[p].size();i++)
          pile[p2].pb(pile[p][i]);
     pile[p].resize(h);
}

void print()
{
     int p,h;
     for(p=0;p<n;p++)
     {
          pf("%d:",p);
          for(h=0;h<pile[p].size();h++)
          {
               pf(" %d",pile[p][h]);
          }
          blank;
     }
}

int main()
{
     int i,a,b;
     sf("%d",&n);
     for(i=0;i<n;i++) pile[i].pb(i);
     char s[5],s1[5];

     while(sf("%s",s) && s[0]!='q')
     {

          sf("%d%s%d",&a,s1,&b);
          int pa,pb,ha,hb;
          find_block(a,pa,ha);
          find_block(b,pb,hb);
          if(pa==pb) continue;
          if(!strcmp(s,"move")) clear_block(pa,ha);
          if(!strcmp(s1,"onto")) clear_block(pb,hb);
          onto_block(pa,ha,pb);
     }
     print();
}

 

例题5-3 安迪的第一个字典(Andy's First Dictionary,Uva 10815)

主要是熟悉set的insert还有iterator

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <cctype>
#include <vector>
#include <set>
#include <sstream>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long

set<string> dict;

int main()
{
     string s,buf;
     while(cin>>s)
     {
          int i;
          for(i=0;i<s.length();i++)
          {
               if(isalpha(s[i])) s[i] = tolower(s[i]);
               else s[i] = ' ';
          }
          stringstream ss(s);
          while(ss>>buf) dict.insert(buf);
     }
     for(set<string>::iterator it = dict.begin();it!=dict.end();++it)
          cout<<*it<<endl;
}

 

例题5-4 反片语(Ananagrams,Uva 156)

主要是熟悉map的用法。

给string和vector<string>排序可以用sort(str.begin(),str.end());即字典序

map<string,int> mp可以直接用mp[string] = int;在这道题可以表示某个字符串出现的次数

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <cctype>
#include <vector>
#include <set>
#include <map>
#include <sstream>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define INF 10000
#define MAXN 5010
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long

map<string,int> cnt;
vector<string> words;

string repr(const string &s)
{
     string ans = s;
     for(int i=0;i<ans.length();i++)
     {
          ans[i] = tolower(ans[i]);
     }
     sort(ans.begin(),ans.end());
     return ans;
}

int main()
{
     string s;
     while(cin>>s)
     {
          if(s[0]=='#') break;
          words.pb(s);
          string r = repr(s);
          if(!cnt.count(r)) cnt[r] = 0;
          cnt[r]++;
     }
     vector<string> ans;
     for(int i = 0;i<words.size();i++)
     {
          if(cnt[repr(words[i])]==1) ans.pb(words[i]);
     }
     sort(ans.begin(),ans.end());
     for(int i = 0;i<ans.size();i++)
     {
          cout<<ans[i]<<endl;
     }

}

 

例题5-5 集合栈计算机(The Set Stack Computer,ACM/ICPC NWERC2006,UVa12096)

 

你可能感兴趣的:(紫书第5章 C++STL)