程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Regional 2011, Asia - Kuala Lumpur 解題報告

Regional 2011, Asia - Kuala Lumpur 解題報告

編輯:C++入門知識

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <ctime>
#define MAXN 111111
#define eps 1e-7
#define INF 1000000007
using namespace std;
char str1[555], str2[555];
char s1[555], s2[555];
int nei[333], wai[333];
int len;
int nm[33];
stack<char>optr;
stack<long long>opnd;
bool flag;
long long calculate(long long x, long long y, char c)
{
    switch(c)
    {
        case '+': return x + y;
        case '-': return x - y;
        case '*': return x * y;
        case '^':
        long long tmp = 1;
        for(int i = 0; i < y; i++) tmp *= x;
        return tmp;
    }
}
char cmp(char a, char b)
{
    if(nei[a] > wai[b]) return '>';
    else if(nei[a] == wai[b]) return '=';
    return '<';
}
long long gao(char *s)
{
    int i = 0;
    long long num;
    while(s[i] != '#' || optr.top() != '#')
    {
        num = 0;
        if(!flag) return -1;
        if(s[i] >= '0' && s[i] <= '9')
        {
            while(s[i] >= '0' && s[i] <= '9')
            {
                num *= 10;
                num += s[i] - '0';
                i++;
            }
            opnd.push(num);
        }
        else if(s[i] >= 'a' && s[i] <= 'z')
        {
            opnd.push(nm[s[i] - 'a']);
            i++;
        }
        else
        {
            switch(cmp(optr.top(), s[i]))
            {
                case '<' : optr.push(s[i]); i++; break;
                case '=' : optr.pop(); i++; break;
                case '>' :
                if(opnd.empty())
                {
                    flag = false;
                    return -1;
                }
                long long ta = opnd.top();
                opnd.pop();
                if(opnd.empty())
                {
                    flag = false;
                    return -1;
                }
                long long tb = opnd.top();
                opnd.pop();
                opnd.push(calculate(tb, ta, optr.top()));
                optr.pop();
                break;
            }
        }
    }
    return opnd.top();
}
void init()
{
    while(!opnd.empty()) opnd.pop();
    while(!optr.empty()) optr.pop();
    optr.push('#');
}
int main()
{
    nei['+'] = 2; wai['+'] = 1;
    nei['-'] = 2; wai['-'] = 1;
    nei['*'] = 4; wai['*'] = 3;
    nei['^'] = 6; wai['^'] = 5;
    nei[')'] = 8; wai[')'] = 0;
    nei['('] = 0; wai['('] = 8;
    nei['#'] = -1; wai['#'] = -1;
    int T;
    scanf("%d", &T);
    getchar();
    srand(time(0));
    while(T--)
    {
        gets(str1);
        len = 0;
        for(int i = 0; str1[i]; i++)
            if(str1[i] != ' ') s1[len++] = str1[i];
        s1[len++] = '#';
        s1[len] = '\0';
        gets(str2);
        len = 0;
        for(int i = 0; str2[i]; i++)
            if(str2[i] != ' ') s2[len++] = str2[i];
        s2[len++] = '#';
        s2[len] = '\0';
        flag = 1;
        for(int i = 0; i < 10; i++)
        {
            for(int j = 0; j < 26; j++) nm[j] = labs(rand()) % 100;
            init();
            long long t1 = gao(s1);
            init();
            long long t2 = gao(s2);
            //printf("%lld %lld\n", t1, t2);
            if(t1 != t2)
            {
                flag = 0;
                break;
            }
        }
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}

 

剛開始看錯題意。敲了一個小時。 然後發現錯了之後換了方法就過了。 大意是一個在二維坐標系上有一些點。 一個人會沿一些直線巡視。 這些直線是平行於X或Y軸的 然後首先這條線上的點他能看見。 他在線上走的時候也會左右瞅。 當然看的視線是垂直於行走方向的 然後如果一個點在一個點後邊。 他是看不到的。因為被擋住了 最後問的是 是否看到了所有點中60%的點   那麼我的思路是: 離散化是肯定的 首先從左到右,看每個x坐標,將其所有y坐標塞進一個vector裡,並先按y排序 然後把所有走的路線中的水平線坐標塞進一個vector裡 然後遍歷該x對應的vector中的y坐標。 在水平線那個vector裡lower_bound找其附近的兩條水平線 看是否被其他點給擋住了。 這樣的話就可以了。同理看每個y坐標
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <map>
#include <cmath>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <ctime>
#define MAXN 211111
#define eps 1e-7
#define INF 1000000007
using namespace std;
int n, m;
int xx[MAXN], yy[MAXN];
int ok[MAXN];
typedef pair<int, int> P;
P p[MAXN];
vector<P>gx[MAXN], gy[MAXN];
vector<int>gh, gv;
typedef vector<int>::iterator Iter;
char op[5];
int main()
{
    int T, cc;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &n, &m);
        for(int i = 0; i < MAXN; i++) gx[i].clear(), gy[i].clear();
        memset(ok, 0, sizeof(ok));
        gh.clear();
        gv.clear();
        for(int i = 0; i < n; i++)
        {
            scanf("%d%d", &p[i].first, &p[i].second);
            xx[i] = p[i].first;
            yy[i] = p[i].second;
        }
        sort(xx, xx + n);
        sort(yy, yy + n);
        int nx = unique(xx, xx + n) - xx;
        int ny = unique(yy, yy + n) - yy;
        for(int i = 0; i < n; i++)
        {
            int px = lower_bound(xx, xx + nx, p[i].first) - xx;
            int py = lower_bound(yy, yy + ny, p[i].second) - yy;
            gx[px].push_back(make_pair(p[i].second, i));
            gy[py].push_back(make_pair(p[i].first, i));
        }
        for(int i = 0; i < nx; i++) sort(gx[i].begin(), gx[i].end());
        for(int i = 0; i < ny; i++) sort(gy[i].begin(), gy[i].end());
        for(int i = 0; i < m; i++)
        {
            scanf("%s%d", op, &cc);
            if(op[0] == 'H') gh.push_back(cc);
            else gv.push_back(cc);
        }
        sort(gh.begin(), gh.end());
        sort(gv.begin(), gv.end());
        unique(gh.begin(), gh.end());
        unique(gv.begin(), gv.end());
        for(int i = 0; i < nx; i++)
        {
            int sz = gx[i].size();
            for(int j = 0; j < sz; j++)
            {
                int ty = gx[i][j].first;
                int id = gx[i][j].second;
                Iter it = lower_bound(gh.begin(), gh.end(), ty);
                if(it != gh.end())
                {
                    if(*it == ty) ok[id] = 1;
                    if(*it > ty)
                    {
                        if(j + 1 < sz)
                        {
                            if(*it <= gx[i][j + 1].first) ok[id] = 1;
                        }
                        else ok[id] = 1;
                    }
                }
                if(it != gh.begin())
                {
                    it--;
                    if(j > 0)
                    {
                        if(*it >= gx[i][j - 1].first) ok[id] = 1;
                    }
                    else ok[id] = 1;
                }
            }
        }
        for(int i = 0; i < ny; i++)
        {
            int sz = gy[i].size();
            for(int j = 0; j < sz; j++)
            {
                int tx = gy[i][j].first;
                int id = gy[i][j].second;
                Iter it = lower_bound(gv.begin(), gv.end(), tx);
                if(it != gv.end())
                {
                    if(*it == tx) ok[id] = 1;
                    if(*it > tx && j + 1 < sz && *it <= gy[i][j + 1].first)
                    ok[id] = 1;
                }
                if(it != gv.begin())
                {
                    it--;
                    if(j > 0 && *it >= gy[i][j - 1].first) ok[id] = 1;
                }
            }
        }
        int cnt = 0;
        for(int i = 0; i < n; i++)
            if(ok[i]) cnt++;
        //printf("%d\n", cnt);
        if((double)cnt / (double)n >= 0.6) puts("PASSED");
        else puts("FAILED");
    }
    return 0;
}

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved