程序设计实习之STL专项练习

A:List
使用list来做这题, 自己写合并结果MLE,用了list自带的merge合并就可以过。。。至今未明。。。
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
char cmd[20];
int id,id1,id2,num;
list *s[10000+10];
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    int n ;
    cin>>n;
    for (int i = 0; i < n; ++i)
    {
        scanf("%s",cmd);
        switch(cmd[0])
        {
           case 'n':
                scanf("%d",&id);
                s[id] = new list;
                s[id]->clear();
                break;
           case 'a':
                scanf("%d %d",&id,&num);
                s[id]->push_back(num);
                break;
           case 'm':
                scanf("%d %d", &id1,&id2);
                //if (s[id1]->size() < s[id2]->size()) swap(s[id1],s[id2]);
                //for (list::iterator i = s[id2]->begin(); i != s[id2]->end(); i++)
                //    s[id1]->push_back(*i);
                s[id1]->merge(*s[id2]);
                //s[id2]->clear();
                break;
           case 'u':
                scanf("%d",&id);
                s[id]->sort();
                s[id]->unique();
                break;
           case 'o':
                scanf("%d",&id);
                s[id]->sort();
                for (list::iterator i = s[id]->begin(); i != s[id]->end(); i++)
                    printf("%d ",*i);
                    printf("\n");
                break;
           default:
                break;
        }
    }
    return 0;
}

B:RPN Calculator

stack 操作后缀表达式
因为没考虑里面有负数的情况 RE的次数略多
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
multiset memory;
stack cal;
int n;
double d;
char cmd[200];
void calc(char ope)
{
     double x = cal.top(); cal.pop();
     double y = cal.top(); cal.pop();
     double z=0;
     switch (ope)
     {
            case '+':
                 z = x+y;break;
            case '-':
                 z = y-x;break;
            case '*':
                 z = x*y;break;
            case '/':
                 z = y/x;break;
            case '^':
                 z = pow(y,x);break;
            default:
                    break;
     }
     cal.push(z);
}
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    cin>>n;
    for (int i = 1; i <= n ;++i)
    {
        scanf("%lf",&d);
        memory.insert(d);
    }
    while (scanf("%s",cmd) != EOF)
    {
          if (strlen(cmd)>1) 
          {
             sscanf(cmd, "%lf", &d);
             cal.push(d);
             continue;
          }
          switch(cmd[0])
          {
             case '+':
             case '-':
             case '*':
             case '/':
             case '^':
                  calc(cmd[0]);
                  break;
             case '=':
                  printf("%e\n", cal.top());
                  memory.erase(memory.begin());
                  memory.insert(cal.top());
                  while (!cal.empty()) cal.pop();
                  break;
             default:
                  sscanf(cmd, "%lf", &d);
                  cal.push(d);
                  break;
          }
    }
    cout<::iterator it = memory.begin();
    for (int i = 1;it != memory.end(); it++, i++)
    {
        printf("%e ",*it);
        if (i%10==0) printf("\n");
    }
    return 0;
}


C:Set

开两个set记录有无出现过。
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;
multiset * multiset_s;
set * set_s;
int main()
{
    
    
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    int n,x; char cmd[10];
    cin>>n;
    multiset_s = new multiset;
    set_s = new set;
    for (int i = 0; i < n;++i)
    {
        scanf("%s", cmd);
        switch(cmd[1])
        {
           case 'd':
                scanf("%d",&x);
                multiset_s->insert(x);
                set_s->insert(x);
                printf("%d\n",multiset_s->count(x));
                break;
           case 'e':
                scanf("%d",&x);
                printf("%d\n",multiset_s->count(x));
                multiset_s->erase(x);
                break;
           case 's':
                scanf("%d",&x);
                printf("%d ",(set_s->find(x)==set_s->end()?0:1));
                printf("%d\n",multiset_s->count(x));
                break;
           default:
                break;
        }
    }
    return 0;
}


D:字符串操作

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
string s[50],cmd,s1,s2;
int n,N,x,l,p;
int getInt();
string getstring();
bool    isDight(string s)
{
   if (s.size()>=6) return false;
   for (int i = 0; i '9' || s[i]<'0') return false;
    return true; 
}
int rfind()
{
       string s1 = getstring();
       int N =  getInt();
       int p = s[N].rfind(s1);
       if (p == string::npos)
            return s[N].size();
       else return p;
}
int find()
{
       string s1 = getstring();
       int N =  getInt();
       int p = s[N].find(s1);
       if (p == string::npos)
            return s[N].size();
       else return p;
}
string copy()
{
      int  N = getInt();
      int  x = getInt();
      int  l = getInt();
      return s[N].substr(x,l);
}
string add()
{
       string s1 = getstring();
       string s2 = getstring();
       if (isDight(s1) && isDight(s2))
       {
          int k = atoi(s1.c_str())+atoi(s2.c_str());
          string s3="";
          while (k>0) s3= char(k%10+'0')+s3,k/=10;
          return s3;
       }
       else 
       return s1+s2;
}
string insert()
{
       string s1 = getstring();
       int N = getInt();
       int x = getInt();
       return s[N].insert(x,s1);
}
void reset()
{
     string s1 = getstring();
     int N = getInt();
     s[N] = s1;
     
}
int getInt()
{
    string temp;
    cin>>temp;
    if (temp == "find")
        return find();
    else if (temp == "rfind")
        return rfind();
    else
    {
        int num = 0;
        for (int i = 0; i >temp;
    if (temp == "copy")
        return copy();
    else if (temp == "add")
        return add();
    else
        return temp;
}
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    cin>>n;
    for (int i= 1; i <= n;++i)
        cin>>s[i];
        
    while (true)
    {
          cin>>cmd;
          switch(cmd[0])
          {
            case 'o':
                 exit(0);
                 break;
            case 'c':
                 s[0] = copy();
                 break;
            case 'a':
                 s[0] = add();
            case 'f':
                 s[0] = find();
                 break;
            case 'r':
                 if (cmd == "rfind")
                 {
                    s[0] = rfind();
                 } else
                    reset();  
                 break;
            case 'i':
                 s[0] = insert();
                 break;
            case 'p':
                 if (cmd.size() == 5)
                    cout << s[getInt()]<

E:热血格斗场


#include 
#include 
#include 
#include 
#include 
using namespace std;
int n,id,value;
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    cin>>n;
    set< pair > Person;
    Person.insert(make_pair(1000000000,1));
    set< pair >::iterator it, temp;
    for (int i = 2; i <= n+1; ++i)
    {
        scanf("%d %d",&id,&value);
        it= Person.lower_bound(make_pair(value,id));
        if (it != Person.end())
           temp = it;
        if (it != Person.begin())
        {
               it --;
               if ( value - it->first <= temp->first - value)
               temp = it;
        }
        Person.insert(make_pair(value,id));
        printf("%d %d\n",id,temp->second);
    }
    return 0;
}

F:冷血格斗场

#include 
#include 
#include 
#include 
#include 
using namespace std;
int n,id,value;
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    cin>>n;
    set< pair > Person;
    Person.insert(make_pair(1000000000,1));
    set< pair >::iterator it, temp;
    for (int i = 2; i <= n+1; ++i)
    {
        scanf("%d %d",&id,&value);
        it= Person.lower_bound(make_pair(value,-1));
        if (it != Person.end())
           temp = it;
        if (it != Person.begin())
        {
               it --;
               it= Person.lower_bound(make_pair(it->first,-1));
               if ( value - it->first < temp->first - value || value - it->first == temp->first - value
               && it->second < temp->second)
               temp = it;
        }
        Person.insert(make_pair(value,id));
        printf("%d %d\n",id,temp->second);
    }
    
    return 0;
}

G:priority queue练习题

这题用set 来做应该是很好做的 删除begin() 和 end() 的元素
用堆来做同时删除最小和最大优点困难,我的做法是用两个堆,小根堆和大根堆,然后用同一个bool数组记录有无被删除,在小根堆中被删除,即使大根堆中
来保留的话,表示为false后的元素,再次从堆中被弹出的时候,视为无效即可。
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;

const int N =  10000000;
int cnt,prime[N+10];
bool flag[N+10],inQueue[10000];
struct Node
{
   int PrimeNumber;
   int value;
   int id;
}v[300+10];
void getPrime()    
{    
    cnt=0;    
    memset(flag,false,sizeof(flag));   
    for(int i=2;i=prime[i] &&  i < N)
     { 
           if (p%prime[i]==0) 
           {
              total++;
              while (p%prime[i]==0) p/=prime[i],number ++;
           }
           i++;
     }
     if (number == 1) total =0;
     return total;
}
struct cmpMax
{
       bool operator ()(const Node & a,const Node & b)
       {
            return (a.PrimeNumber < b.PrimeNumber || a.PrimeNumber == b.PrimeNumber
            && a.value < b.value);
       }
};
struct cmpMin
{
       bool operator ()(const Node & a,const Node & b)
       {
            return (a.PrimeNumber > b.PrimeNumber || a.PrimeNumber == b.PrimeNumber
            && a.value > b.value);
       }
};
int main()
{
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    int n,num;
    cin>>n;
    getPrime();
    priority_queue, cmpMax > qMax;
    priority_queue, cmpMin > qMin;
    memset(inQueue, true, sizeof(inQueue));
    for (int test= 0; test




你可能感兴趣的:(程序设计实习之STL专项练习)