zoukankan      html  css  js  c++  java
  • 2017北京区域赛

    https://www.cnblogs.com/31415926535x/p/11668631.html

    模拟题场啊,,,,,

    题目链接

    E - Cats and Fish

    签到题吧,,读完题后感觉是模拟,,然后写完之后一测样例wa了,,这时队友说推出公示了,,于是我就放弃调去看别的题了,,,但是wa了几发后又用模拟过的,,,

    直接模拟时间,,记录每只猫的状态,,每次判断一下就行了,,,

    #include <bits/stdc++.h>
    #define aaa cout<<233<<endl;
    #define endl '
    '
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    // mt19937 rnd(TM(0));
    const int inf = 0x3f3f3f3f;//1061109567 > 1e9
    const ll linf = 0x3f3f3f3f3f3f3f3f;
    const double eps = 1e-6;
    const double pi = 3.14159265358979;
    const int maxn = 1e3+ 5;
    const int maxm = 1e7 + 233;
    const int mod = 1e9 + 7;
    
    int a[maxn], n, m, x;
    bool vis[maxn];
    int TM[maxn];
    int main()
    {
        // double pp = clock();
        // freopen("233.in", "r", stdin);
        // freopen("233.out", "w", stdout);
        ios_base::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
    
        while(cin >> m >> n >> x)
        {
            for(int i = 1; i <= n; ++i)cin >> a[i];
            for(int i = 1; i <= n; ++i)vis[i] = false;
            for(int i = 1; i <= n; ++i)TM[i] = 0;
            sort(a + 1, a + 1 + n);
            int all = 0;
            for(int t = 1; t <= x; ++t)
            {
                for(int i = 1; i <= n; ++i)
                    if(!vis[i] && all < m)
                    {
                        vis[i] = true;
                        ++all;
                    }
                for(int i = 1; i <= n; ++i)if(vis[i])++TM[i];
                for(int i = 1; i <= n; ++i)
                    if(vis[i])
                    {
                        TM[i] %= a[i];
                        if(TM[i] == 0)vis[i] = false;
                    }
            }
            int ans = 0;
            for(int i = 1; i <= n; ++i)if(vis[i])++ans;
            cout << m - all << " " << ans << endl;
        }
    
        // cout << endl << (clock() - pp) / CLOCKS_PER_SEC << endl;
        return 0;
    }
    

    F - Secret Poems

    小模拟

    #include <bits/stdc++.h>
    #define aaa cout<<233<<endl;
    #define endl '
    '
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    // mt19937 rnd(TM(0));
    const int inf = 0x3f3f3f3f;//1061109567 > 1e9
    const ll linf = 0x3f3f3f3f3f3f3f3f;
    const double eps = 1e-6;
    const double pi = 3.14159265358979;
    const int maxn = 1e3+ 5;
    const int maxm = 1e7 + 233;
    const int mod = 1e9 + 7;
    
    char s[maxn][maxn];
    char str[maxn * maxn];
    char t[maxn][maxn];
    int main()
    {
        // double pp = clock();
        // freopen("233.in", "r", stdin);
        // freopen("233.out", "w", stdout);
        ios_base::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
    
        int n;
        while(cin >> n)
        {
            for(int i = 1; i <= n; ++i)cin >> s[i] + 1;
            if(n == 1)
            {
                cout << s[1] + 1 << endl;
                continue;
            }
            int i = 1, j = 1, tot = 1;
            str[tot++] = s[i][j];
            while(i <= n && j <= n)
            {
                if(j == n)
                {
                    ++i;
                    str[tot++] = s[i][j];
                }
                else
                {
                    ++j; 
                    str[tot++] = s[i][j];
                }
                
                while(true)
                {
                    ++i; --j;
                    str[tot++] = s[i][j];
                    if(j == 1 || i == n)break;
                }
                if(j == 1 && i != n)
                {
                    ++i;
                    str[tot++] = s[i][j];
                }
                else if(i == n)
                {
                    ++j;
                    str[tot++] = s[i][j];
                }
                while(true)
                {
                    --i; ++j;
                    str[tot++] = s[i][j];
                    if(i == 1 || j == n)break;
                }
            }
            // for(int i = 1; i <= tot; ++i)cout << str[i];cout << endl;
            int l = 1, r = n, up = 1, dn = n;
            tot = 1;
            while(l <= r && up <= dn)
            {
                for(int i = l; i <= r; ++i)t[up][i] = str[tot++];
                ++up;
                for(int i = up; i <= dn; ++i)t[i][r] = str[tot++];
                --r;
                for(int i = r; i >= l; --i)t[dn][i] = str[tot++];
                --dn;
                for(int i = dn; i >= up; --i)t[i][l] = str[tot++];
                ++l;
            }
            for(int i = 1; i <= n; ++i)
            {
                for(int j = 1; j <= n; ++j)
                    cout << t[i][j];
                cout << endl;
            }
        }
        
        // cout << endl << (clock() - pp) / CLOCKS_PER_SEC << endl;
        return 0;
    }
    

    G - Liaoning Ship’s Voyage

    啊,,,计算几何+bfs,,

    判断一下每一个点之间合不合法,,连边bfs即可,,

    判断就是看这两个点在不在三角形里,,三角形里的点一定是没有边的,有相交的也不行,,,但是因为边上点可以走,,所以要判断一下在边上的情况,,尤其是:

    这样的情况我以为中间判了,,但是实际没判,,,疯狂wa,,,自闭,,,

    #include <bits/stdc++.h>
    #define aaa cout<<233<<endl;
    #define endl '
    '
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    // mt19937 rnd(TM(0));
    const int inf = 0x3f3f3f3f;//1061109567 > 1e9
    const ll linf = 0x3f3f3f3f3f3f3f3f;
    const double eps = 1e-6;
    const double pi = 3.14159265358979;
    const int maxn = 1e4 + 5;
    const int maxm = 1e7 + 233;
    const int mod = 1e9 + 7;
    
    // .......
    int sgn(double x){
        if(fabs(x) < eps)return 0;
        if(x < 0)return -1;
        else return 1;
    }
    struct Point{
        double x, y;
        Point(){}
        Point(double _x, double _y){
            x = _x; y = _y;
        }
        void input(){
            // scanf("%lf%lf", &x, &y);
            cin >> x >> y;
        }
        bool operator==(Point b)const{
            return sgn(x - b.x) == 0 && sgn(y - b.y) == 0;
        }
        bool operator <(Point b)const{
            return sgn(x - b.x) == 0 ? sgn(y - b.y) < 0 : x < b.x;
        }
        Point operator-(const Point &b)const{
            return Point(x - b.x, y - b.y);
        }
        double operator*(const Point &b)const{
            return x * b.x + y * b.y;
        }
        double operator^(const Point &b)const{
            return x * b.y - y * b.x;
        }
        double distance(Point p){
            return hypot(x - p.x, y - p.y);
        }
    }p1, p2, p3;
    struct Line{
        Point s, e;
        Line(){}
        Line(Point _s, Point _e){
            s = _s;
            e = _e;
        }
        bool operator==(Line v){
            return (s == v.s) && (e == v.e);
        }
        void init(Point a, Point b){
            s = a;
            e = b;
        }
        double length(){
            return s.distance(e);
        }
        double dispointtoline(Point p){
            return fabs((p - s) ^ (e - s)) / length();
        }
        double dispointtoseg(Point p){
            if(sgn((p - s) * (e - s)) < 0 || sgn((p - e) * (s - e)) < 0)
                return min(p.distance(s), p.distance(e));
            return dispointtoline(p);
        }
        int segcrosseg(Line v){
            int d1 = sgn((e - s) ^ (v.s - s));
            int d2 = sgn((e - s) ^ (v.e - s));
            int d3 = sgn((v.e - v.s) ^ (s - v.s));
            int d4 = sgn((v.e - v.s) ^ (e - v.s));
            if((d1 ^ d2) == -2 && (d3 ^ d4) == -2)return 2;
            return (d1 == 0 && sgn((v.s - s) * (v.s - e)) <= 0) ||
                (d2 == 0 && sgn((v.e - s) * (v.e - e)) <= 0) ||
                (d3 == 0 && sgn((s - v.s) * (s - v.e)) <= 0) ||
                (d4 == 0 && sgn((e - v.s) * (e - v.e)) <= 0);
        }
        bool pointonseg(Point p){
            return sgn((p - s) ^ (e - s)) == 0 && sgn((p - s) * (p - e)) <= 0;
        }
        double getarea(Point p){
            double area = dispointtoline(p) * length() / 2;
            return area;
        }
    }l1, l2, l3;
    
    // ........
    
    
    struct egde{
        int to, nxt;
    }edge[maxn << 1];
    int tot, head[maxn << 1];
    void init(){
        tot = 0;
        memset(head, -1, sizeof head);
    }
    void addedge(int u, int v){
        // if(!(tot & 1))cout << u << "->" << v << endl;
        edge[tot].to = v;
        edge[tot].nxt = head[u];
        head[u] = tot++;
    }
    int dis[maxn];
    bool vis[maxn];
    queue<int> q;
    void dijkstra(int n, int s)
    {
        memset(vis, false, sizeof vis);
        memset(dis, inf, sizeof dis);
        while(!q.empty())q.pop();
        q.push(s);
        dis[s] = 0;
        while(!q.empty())
        {
            int u = q.front(); q.pop();
            if(vis[u])continue;
            vis[u] = true;
            for(int i = head[u]; ~i; i = edge[i].nxt)
            {
                int v = edge[i].to;
                if(dis[v] > dis[u] + 1)
                {
                    dis[v] = dis[u] + 1;
                    q.push(v);
                }
            }
        }   
    }
    
    int n;
    char mp[25][25];
    map<Point, bool> mp1, mp2, mp3, p;
    inline int getidx(int x, int y){return x * n + y;}
    bool check(Point a, Point b)
    {
        Line l = Line(a, b);
        // if(a.x == 0 && a.y == 1){
        //     cout << a.x << " " << a.y << "; " << b.x << " " << b.y << endl;
        //     cout << l.segcrosseg(l1) << endl;
        //     cout << l.segcrosseg(l2) << endl;
        //     cout << l.segcrosseg(l3) << endl;
        // }
        if(l.segcrosseg(l1) == 2 || l.segcrosseg(l2) == 2 || l.segcrosseg(l3) == 2)return false;
        if(mp1[a] && mp1[b])return true;
        else if(mp2[a] && mp2[b])return true;
        else if(mp3[a] && mp3[b])return true;
        if(!p[a] || !p[b])
        {
            if((mp1[a] && mp2[b]) || (mp1[a] && mp3[b]) || (mp2[a] && mp1[b]) || (mp2[a] && mp3[b]) || (mp3[a] && mp1[b]) || (mp3[a] && mp2[b]))return false;
        }
        if(l.segcrosseg(l1) == 1 && l.segcrosseg(l2) == 1 && l.segcrosseg(l3) == 1)return false;
        if(l.segcrosseg(l1) == 1 || l.segcrosseg(l2) == 1 || l.segcrosseg(l3) == 1)return true;
        
        // if(l.segcrosseg(l1) == 1 || l.segcrosseg(l2) == 1 || l.segcrosseg(l3) == 1)return false;
        return true;
    }
    int main()
    {
        // double pp = clock();
        // freopen("233.in", "r", stdin);
        // freopen("233.out", "w", stdout);
        ios_base::sync_with_stdio(0);
        cin.tie(0);cout.tie(0);
        while(cin >> n)
        {
            p1.input(); p2.input(); p3.input();
            for(int i = n - 1; i >= 0; --i)cin >> mp[i];
            mp[0][0] = '.';
            l1.init(p1, p2); l2.init(p1, p3); l3.init(p2, p3);
            double area = l1.getarea(p3);
            mp1.clear(); mp2.clear(); mp3.clear(); p.clear();
            p[p1] = true; p[p2] = true; p[p3] = true;
            for(int i = 0; i <= n - 1; ++i)
            {
                for(int j = 0; j <= n - 1; ++j)
                {
                    if(mp[i][j] == '#')continue;
                    Point p = Point(j, i);
                    double area1 = l1.getarea(p);
                    double area2 = l2.getarea(p);
                    double area3 = l3.getarea(p);
                    if(l1.pointonseg(p))mp1[p] = true;
                    if(l2.pointonseg(p))mp2[p] = true;
                    if(l3.pointonseg(p))mp3[p] = true;
                    if(sgn(area1 + area2 + area3 - area) == 0)mp[i][j] = '#';
                    if(mp1[p] || mp2[p] || mp3[p])mp[i][j] = '.';
                }
            }
            int dx[] = {-1, -1, 0, 1, 1, 1, 0, -1};
            int dy[] = {0, 1, 1, 1, 0, -1, -1, -1};
            Point p, q;
            init();
            for(int i = 0; i <= n - 1; ++i)
            {
                for(int j = 0; j <= n - 1; ++j)
                {
                    if(mp[i][j] == '#')continue;
                    p = Point((double)j, (double)i);
                    for(int k = 0; k <= 7; ++k)
                    {
                        int x = j + dx[k];
                        int y = i + dy[k];
                        if(x < 0 || x >= n || y < 0 || y >= n)continue;
                        if(mp[y][x] == '#')continue;
                        q = Point((double)x, (double)y);
                        if(check(p, q))
                            addedge(getidx(j, i), getidx(x, y)), addedge(getidx(x, y), getidx(j, i));
                    }
                }
            }
            dijkstra(n * n, 0);
            // for(int i = 0; i <= n * n; ++i)cout << i << ": " << dis[i] << endl;
            if(dis[getidx(n - 1, n - 1)] == inf)cout << -1 << endl;
            else cout << dis[getidx(n - 1, n - 1)] << endl;
        }
    
        return 0;
    }
    

    (end)

  • 相关阅读:
    让资源管理器不显示最近常用文件夹
    票房实际是屌丝血
    为什么读了很多书,还是过不好这一生?
    抱怨就像呕吐
    finally关键字小复习
    Java中菜单组件
    Java的GUI窗体出现乱码解决方法
    Java中GUI的默认窗体布局 和 常见的窗体布局方案
    适配器类(便利类)的由来:当你自己写的类中想用某个接口中个别方法的时候(注意:不是所有的方法),肿么办?
    技术管理者工作成效评估表
  • 原文地址:https://www.cnblogs.com/31415926535x/p/11668631.html
Copyright © 2011-2022 走看看