第五章 UVA

Uva 12096

自己代码

#include <bits/stdc++.h>
using namespace std;

typedef set<int> Set;
map<Set, int> mark;
int cnt = 0;
Set s[2010];

int ID(Set x){
    if(!mark.count(x)) {
        mark[x] = cnt++;
        s[mark[x]] = x;
    }
    return mark[x];
}

int main()
{
    int t;
    cin >> t;
    while( t--){
        int n;
        cin >> n;
        cnt = 0;
        mark.clear();
        stack<int> sta;
        for(int i = 0; i < 2000; i++) s[i].clear();

        for(int i = 0; i < n; i++){
            string quer;
            cin >> quer;
            if(quer[0] == 'P') sta.push(ID(Set()));
            else if(quer[0] == 'D') sta.push(sta.top());
            else{
                Set x1 = s[sta.top()]; sta.pop();
                Set x2 = s[sta.top()]; sta.pop();
                Set x;
                //printf(" x1 %d  x2 %d\n", ID(x1), ID(x2));
                //cout<<quer[0]<<endl;
                if(quer[0] == 'U') set_union(x1.begin(), x1.end(), x2.begin(), x2.end(), inserter(x, x.begin()));
                if(quer[0] == 'I') set_intersection(x1.begin(), x1.end(), x2.begin(), x2.end(), inserter(x, x.begin()));
                if(quer[0] == 'A') x = x2, x.insert(ID(x1));
                sta.push(ID(x));
            }

            printf("%d\n", s[sta.top()].size());
        }

        printf("***\n");
    }
    return 0;
}

代码库:

#include <iostream>  
#include <set>  
#include <map>  
#include <stack>  
#include <vector>  
#include <algorithm>  
using namespace std;  
typedef set<int> Set;  
map<Set,int> IDcache;  
vector<Set> Setcache;  
int ID(Set x)  
{  
    if(IDcache.count(x)) return IDcache[x];  
    Setcache.push_back(x);  
    return IDcache[x]=Setcache.size()-1;  
}  
#define ALL(x) x.begin(),x.end()  
#define INS(x) inserter(x,x.begin())  
stack<int> s;  
int main(void)  
{  
    int n;  
    cin>>n;  
    while(n--)  
    {  
        int m;  
        cin>>m;  
        for(int i=0;i<m;i++)  
        {  
            string op;  
            cin>>op;  
            if(op[0]=='P') s.push(ID(Set()));  
            else if(op[0]=='D') s.push(s.top());  
            else  
            {  
                Set x1=Setcache[s.top()];s.pop();  
                Set x2=Setcache[s.top()];s.pop();  
                Set x;  
                if(op[0]=='U') set_union(ALL(x1),ALL(x2),INS(x));  
                if(op[0]=='I') set_intersection(ALL(x1),ALL(x2),INS(x));  
                if(op[0]=='A') {x=x2;x.insert(ID(x1));}  
                s.push(ID(x));  
            }  
            cout<<Setcache[s.top()].size()<<endl;  
        }  
        cout<<"***"<<endl;  
    }  
    return 0;  
}  

uva 540

// UVa540 Team Queue
// Rujia Liu
#include<cstdio>
#include<queue>
#include<map>
using namespace std;

const int maxt = 1000 + 10;

int main() {
  int t, kase = 0;
  while(scanf("%d", &t) == 1 && t) {
    printf("Scenario #%d\n", ++kase);

    // 记录所有人的团队编号
    map<int, int> team; // team[x]表示编号为x的人所在的团队编号
    for(int i = 0; i < t; i++) {
      int n, x;
      scanf("%d", &n);
      while(n--) { scanf("%d", &x); team[x] = i; }
    }

    // 模拟
    queue<int> q, q2[maxt]; // q是团队的队列,而q2[i]是团队i成员的队列
    for(;;) {
      int x;
      char cmd[10];
      scanf("%s", cmd);
      if(cmd[0] == 'S') break;
      else if(cmd[0] == 'D') {
        int t = q.front();
        printf("%d\n", q2[t].front()); q2[t].pop();
        if(q2[t].empty()) q.pop(); // 团体t全体出队列
      }
      else if(cmd[0] == 'E') {
        scanf("%d", &x);
        int t = team[x];
        if(q2[t].empty()) q.push(t); // 团队t进入队列
        q2[t].push(x);
      }
    }
    printf("\n");
  }

  return 0;
} 

uva 136

// UVa136 Ugly Numbers
// Rujia Liu
#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;
typedef long long LL;
const int coeff[3] = {2, 3, 5};

int main() {
  priority_queue<LL, vector<LL>, greater<LL> > pq;
  set<LL> s;
  pq.push(1);
  s.insert(1);
  for(int i = 1; ; i++) {
    LL x = pq.top(); pq.pop();
    if(i == 1500) {
      cout << "The 1500'th ugly number is " << x << ".\n";
      break;
    }
    for(int j = 0; j < 3; j++) {
      LL x2 = x * coeff[j];
      if(!s.count(x2)) { s.insert(x2); pq.push(x2); }
    }
  }
  return 0;
}

uva 400

// UVa400 Unix ls
// Rujia Liu
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

const int maxcol = 60;
const int maxn = 100 + 5;
string filenames[maxn];

// 输出字符串s,长度不足len时补字符extra
void print(const string& s, int len, char extra) {
  cout << s;
  for(int i = 0; i < len-s.length(); i++)
    cout << extra;
}

int main() {
  int n;
  while(cin >> n) {
    int M = 0;
    for(int i = 0; i < n; i++) {
      cin >> filenames[i];
      M = max(M, (int)filenames[i].length());
    }
    // 计算列数cols和行数rows
    int cols = (maxcol - M) / (M + 2) + 1, rows = (n - 1) / cols + 1;
    print("", 60, '-');
    cout << "\n";
    sort(filenames, filenames+n);
    for(int r = 0; r < rows; r++) {
      for(int c = 0; c < cols; c++) {
        int idx = c * rows + r;
        if(idx < n) print(filenames[idx], c == cols-1 ? M : M+2, ' ');
      }
      cout << "\n";
    }
  }
  return 0;
}

uva 1592

// UVa1592 Database
// Rujia Liu
// 本程序只是为了演示STL各种用法,效率较低。实践中一般用C字符串和哈希表来实现。

#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<map>
#include<sstream>
using namespace std;

typedef pair<int,int> PII;

const int maxr = 10000 + 5;
const int maxc = 10 + 5;

int m, n, db[maxr][maxc], cnt;

map<string, int> id;
int ID(const string& s) {
  if(!id.count(s)) {
    id[s] = ++cnt;
  }
  return id[s];
}

void find() {
  for(int c1 = 0; c1 < m; c1++)
    for(int c2 = c1+1; c2 < m; c2++) {
      map<PII, int> d;
      for(int i = 0; i < n; i++) {
        PII p = make_pair(db[i][c1], db[i][c2]);
        if(d.count(p)) {
          printf("NO\n");
          printf("%d %d\n", d[p]+1, i+1);
          printf("%d %d\n", c1+1, c2+1);
          return;
        }
        d[p] = i;
      }
    }
  printf("YES\n");
}


int main() {
  string s;
  while(getline(cin, s)) {
    stringstream ss(s);
    if(!(ss >> n >> m)) break;
    cnt = 0;
    id.clear();
    for(int i = 0; i < n; i++) {
      getline(cin, s);
      int lastpos = -1;
      for(int j = 0; j < m; j++) {
        int p = s.find(',', lastpos+1);
        if(p == string::npos) p = s.length();
        db[i][j] = ID(s.substr(lastpos+1, p - lastpos - 1));
        lastpos = p;
      }
    }
    find();
  }
  return 0;
}

uva 207

// UVa207 PGA Tour Prize Money
// Rujia Liu
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cassert>
using namespace std;

#define REP(i,n) for(int i = 0; i < (n); i++)

const int maxn = 144;
const int n_cut = 70;

struct Player {
  char name[25];
  int amateur;
  int sc[4];
  int sc36, sc72, dq;
  int rnds;
} player[maxn];

int n;
double purse, p[n_cut];

bool cmp1(const Player& p1, const Player& p2) {
  if(p1.sc36 < 0 && p2.sc36 < 0) return false; // equal
  if(p1.sc36 < 0) return false; // p2 smaller
  if(p2.sc36 < 0) return true; // p1 smaller
  return p1.sc36 < p2.sc36;
}

bool cmp2(const Player& p1, const Player& p2) {
  if(p1.dq && p2.dq) {
    if(p1.rnds != p2.rnds) return p2.rnds < p1.rnds;
    if(p1.sc72 != p2.sc72) return p1.sc72 < p2.sc72;
    return strcmp(p1.name, p2.name) < 0;
  }
  if(p1.dq) return false;
  if(p2.dq) return true;
  if(p1.sc72 != p2.sc72) return p1.sc72 < p2.sc72;
  return strcmp(p1.name, p2.name) < 0;
}

void print_result() {
  printf("Player Name          Place     RD1  RD2");
  printf("  RD3  RD4  TOTAL     Money Won\n");
  printf("---------------------------------------");
  printf("--------------------------------\n");

  int i = 0, pos = 0;
  while(i < n) {
    if(player[i].dq) {
      printf("%s           ",player[i].name);
      REP(j,player[i].rnds) printf("%-5d", player[i].sc[j]);
      REP(j,4-player[i].rnds) printf("     ");
      printf("DQ\n");
      i++;
      continue;
    }

    int j = i;
    int m = 0; // number of tied players
    bool have_money = false;
    double tot = 0.0; // total pooled money
    while(j < n && player[i].sc72 == player[j].sc72) {
      if(!player[j].amateur) {
        m++;          
        if(pos < n_cut) {
          have_money = true; // yeah! they still have money
          tot += p[pos++];
        }
      }
      j++;
    }

    // print player [i,j) together because they have the same rank
    int rank = i + 1; // rank of all these m players
    double amount = purse * tot / m; // if m=0, amount will be nan but we don't use it in that case :)
    while(i < j) {
      printf("%s ", player[i].name);
      char t[5];
      sprintf(t, "%d%c", rank, m > 1 && have_money && !player[i].amateur ? 'T' : ' ');
      printf("%-10s", t);
      REP(e,4) printf("%-5d", player[i].sc[e]);

      // with prize
      if(!player[i].amateur && have_money) {
        printf("%-10d", player[i].sc72);
        printf("$%9.2lf\n", amount / 100.0);
      } else
        printf("%d\n", player[i].sc72);
      i++;
    }
  }
}

int main() {
  int T; 
  char s[40];

  gets(s);
  sscanf(s,"%d",&T);
  while(T--) {
    gets(s); // empty line

    // prize
    gets(s);
    sscanf(s,"%lf", &purse);
    REP(i,n_cut) {
      gets(s);
      sscanf(s, "%lf", &p[i]);
    }

    // players
    gets(s);
    sscanf(s, "%d", &n);
    assert(n <= 144);
    REP(k,n) {
      // read a 32-character line
      gets(s);

      // player name
      strncpy(player[k].name, s, 20);      
      player[k].name[20] = 0;
      player[k].amateur = 0;
      if(strchr(player[k].name, '*')) {
        player[k].amateur = 1;
      }

      // scores
      player[k].sc36 = player[k].sc72 = player[k].dq=0;
      memset(player[k].sc, -1, sizeof(player[k].sc));
      REP(i,4) {
        // raw score
        char t[5];
        REP(j,3) t[j] = s[20 + i*3 + j]; t[3] = '\0';

        // parse
        if(!sscanf(t,"%d", &player[k].sc[i])) {
          // DQ!
          player[k].rnds = i;
          player[k].dq = -1;
          if(i < 2) player[k].sc36 = -1;
          break; // skip other rounds (filled with -1, initially)
        } else {          
          player[k].sc72 += player[k].sc[i];
          if(i < 2)
            player[k].sc36 += player[k].sc[i];
        }
      }
    }

    // round 1
    sort(player, player+n, cmp1);
    assert(player[n_cut-1].sc36 >= 0);
    for(int i = n_cut-1; i < n; i++)
      if(i == n-1 || player[i].sc36 != player[i+1].sc36) { n = i+1; break; }

    // round 2
    sort(player, player+n, cmp2);

    // print result
    print_result();

    if(T) printf("\n");
  }

  return 0;
}

uva 814

// UVa814 The Letter Carrier's Rounds
// Rujia Liu
#include<iostream>
#include<string>
#include<vector>
#include<set>
#include<map>
using namespace std;

void parse_address(const string& s, string& user, string& mta) {
  int k = s.find('@');
  user = s.substr(0, k);
  mta = s.substr(k+1);
}

int main() {
  int k;
  string s, t, user1, mta1, user2, mta2;
  set<string> addr;

  // 输入所有MTA,转化为地址列表
  while(cin >> s && s != "*") {
    cin >> s >> k;
    while(k--) { cin >> t; addr.insert(t + "@" + s); }
  }

  while(cin >> s && s != "*") {
    parse_address(s, user1, mta1); // 处理发件人地址

    vector<string> mta; // 所有需要连接的mta,按照输入顺序
    map<string, vector<string> > dest; // 每个mta需要发送的用户
    set<string> vis;
    while(cin >> t && t != "*") {
      parse_address(t, user2, mta2); // 处理收件人地址
      if(vis.count(t)) continue;     // 重复的收件人
      vis.insert(t);
      if(!dest.count(mta2)) { mta.push_back(mta2); dest[mta2] = vector<string>(); }
      dest[mta2].push_back(t);
    }
    getline(cin, t); // 把"*"这一行的回车吃掉

    // 输入邮件正文
    string data;
    while(getline(cin, t) && t[0] != '*') data += "     " + t + "\n";

    for(int i = 0; i < mta.size(); i++) {
      string mta2 = mta[i];
      vector<string> users = dest[mta2];
      cout << "Connection between " << mta1 << " and " << mta2 <<endl;
      cout << "     HELO " << mta1 << "\n";
      cout << "     250\n";
      cout << "     MAIL FROM:<" << s << ">\n";
      cout << "     250\n";
      bool ok = false;
      for(int i = 0; i < users.size(); i++) {
        cout << "     RCPT TO:<" << users[i] << ">\n";
        if(addr.count(users[i])) { ok = true; cout << "     250\n"; }
        else cout << "     550\n";
      }
      if(ok) {
        cout << "     DATA\n";
        cout << "     354\n";
        cout << data;
        cout << "     .\n";
        cout << "     250\n";
      }
      cout << "     QUIT\n";
      cout << "     221\n";
    }
  }
  return 0;
}

uva 221

// UVa221 Urban Elevations
// Rujia Liu
#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 100 + 5;

struct Building {
  int id;
  double x, y, w, d, h;
  bool operator < (const Building& rhs) const {
    return x < rhs.x || (x == rhs.x && y < rhs.y);
  }
} b[maxn];

int n;
double x[maxn*2];

bool cover(int i, double mx) {
  return b[i].x <= mx && b[i].x+b[i].w >= mx;
}

// 判断建筑物i在x=mx处否可见
bool visible(int i, double mx) {
  if(!cover(i, mx)) return false;
  for(int k = 0; k < n; k++)
    if(b[k].y < b[i].y && b[k].h >= b[i].h && cover(k, mx)) return false;
  return true;
}

int main() {
  int kase = 0;
  while(scanf("%d", &n) == 1 && n) {
    for(int i = 0; i < n; i++) {
      scanf("%lf%lf%lf%lf%lf", &b[i].x, &b[i].y, &b[i].w, &b[i].d, &b[i].h);
      x[i*2] = b[i].x; x[i*2+1] = b[i].x + b[i].w;
      b[i].id = i+1;
    }
    sort(b, b+n);
    sort(x, x+n*2);
    int m = unique(x, x+n*2) - x; // x坐标排序后去重,得到m个坐标

    if(kase++) printf("\n");
    printf("For map #%d, the visible buildings are numbered as follows:\n%d", kase, b[0].id);
    for(int i = 1; i < n; i++) {
      bool vis = false;
      for(int j = 0; j < m-1; j++)
        if(visible(i, (x[j] + x[j+1]) / 2)) { vis = true; break; }
      if(vis) printf(" %d", b[i].id);
    }
    printf("\n");
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值