• Mutual Training for Wannafly Union #2


    codeforces 298A. Snow Footprints

    分类讨论三种情况:

    ①..RRRRRR… 

    ②..LLLLLLL…

    ③..RRRLLLL..

    //AC by lwq:

    #include<stdio.h>
    #include<algorithm>
    #include<string>
    #include<string.h>
    using namespace std;
    
    int main()
    {
        int n;
        scanf("%d",&n);
        char ss[1005];
        scanf("%s",ss);
        int len=strlen(ss);
        int i;
        int begin,end;
        for(i=0;i<len;i++)
        {
            if(ss[i]=='.')
            continue;
            else if(ss[i]=='R')
            {
                begin=i;
                break;
            }
            else if(ss[i]=='L')
            {
                end=i;
                break;
            }
        }
        if(ss[begin]=='R')
        {
            for(i=begin+1;i<len;i++)
            {
                if(ss[i]=='.')
                {
                    end=i;
                    break;
                }
                else if(ss[i]=='L')
                {
                    end=i-1;
                    break;
                }
                else
                continue;
            }
            printf("%d %d",begin+1,end+1);
        }
        else if(ss[begin]=='L')
        {
            for(i=len-1;i>=0;i--)
            {
                if(ss[i]=='L')
                {
                    begin=i;
                    break;
                }
                else
                {
                    continue;
                }
            }
            printf("%d %d",begin+1,end);
        }
        return 0;
    }

    codeforces 298B. Sail

    模拟。水题。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    char q[100005];
    int main()
    {
        int t,sx,sy,ex,ey;
        scanf("%d %d %d %d %d",&t,&sx,&sy,&ex,&ey);
        scanf("%s",q);
        int ans=0;
        bool f=false;
        for(int i=0;i<t;i++)
        {
            ans++;
            if(q[i]=='E')
            {
                if(sx<ex)
                    sx++;
            }
            else if(q[i]=='S')
            {
                if(sy>ey)
                    sy--;
            }
            else if(q[i]=='W')
            {
                if(sx>ex)
                    sx--;
            }
            else if(q[i]=='N')
            {
                if(sy<ey)
                    sy++;
            }
            if(sx==ex&&sy==ey)
            {
                f=true;
                break;
            }
        }
        if(f)
        printf("%d
    ",ans);
        else
        printf("-1
    ");
        return 0;
    }

    codeforces 382C. Arithmetic Progression

    分类讨论:

    先考虑特例:n = 1时,有无数组解,答案为 -1

    然后根据存在的公差d的数量进行分类:

    ①d只有一种:

    1.若d1 = 0,答案只有一种,输出a[1]

    2.若d1为偶数并且只有两个数(n=2),则答案有三种:a[1] - d1,  a[1]+d1/2, a[n] + d1  , 例如:2 4 -> 0 3 6

    3.其他情况:答案有两种:a[1] – d1, a[n] + d1,例如:1 4 7 –> –2 10

    ②d有两种:d1, d2(设d2 > d1)

    1.若d2 = 2 * d1 并且 cnt(d2) = 1(d2的数量只有一个),则答案只有一种:

    根据d1, d2的顺序再分两小类:

    (1)a[k]-d1(k为出现第二种公差的位置),例如:1 3 5 9 –> 7

    (2)a[k-1]-d1,例如:-1 1 2 3 –> 0

    2.其他情况:无解,答案为0

    ③d有三种以上:无解,答案为0

    //AC by lyy:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<string>
    #include<cmath>
    #include<queue>
    #include<limits.h>
    #define CLR(a,b) memset((a),(b),sizeof((a)))
    using namespace std;
    typedef long long ll;
    const int mod = 1e9+7;
    const int N = 1e5+5;
    const int inf = 0x3f3f3f3f;
    
    int n;
    ll a[N];
    
    int main() {
        int i, j;
        ll d1 , d2;
    
        ll k;
    
        scanf("%d", &n);
        for(i = 1; i <= n; ++i) {
            scanf("%lld", &a[i]);
        }
        sort(a+1, a+1+n);
        int t;
        if(n == 1) {printf("-1
    "); return 0;}
    
        int cnt1 = 0, cnt2 = 0;//d1,d2数量
    
        d1 = d2 = a[2] - a[1];
        int f = 1;//只有d1
    
        for(i = 2; i <= n; ++i) {
            if(f == 3) { printf("0
    "); return 0; }//有三个以上d
            t = a[i] - a[i-1];
            if(t == d1) cnt1++;
            else if(t == d2) cnt2++;
            else if(t != d1 && f == 1) { cnt2++; d2 = t; f = 2; k = i;}//有d2
            else if(t != d1 && t != d2 && f == 2) { f = 3; }
        }
        int ff = 1;
        if(d1 > d2) { ff = 2; swap(d1, d2); swap(cnt1, cnt2); }  //d2 > d1
    
        if(f == 1) {
            if(d1 == 0) {printf("1
    %lld
    ", a[1]);}     
            else if((d1 % 2 == 0) &&  n == 2 ) { printf("3
    %lld %lld %lld
    ", a[1]-d1, a[1]+d1/2, a[n]+d1); }
            else { printf("2
    %lld %lld
    ", a[1]-d1, a[n]+d1); }
        }
        else {  //f = 2
            if(d2 == 2*d1 && cnt2 == 1) {
                if(ff == 1)
                printf("1
    %lld
    ", a[k]-d1);
                else printf("1
    %lld
    ", a[k-1]-d1);
            }
            else printf("0
    ");
        }
        return 0;
    }

    codeforces 450D. Jzzhu and Cities 【SPFA】

    题意:有n个城市,编号1~n,已知有m条公路和k条铁轨, 保证从1号城市到其他城市距离最短,问可以关闭多少条铁轨。

    题解:最短路,看着还有重边,想想SPFA的复杂度E log V,看着数据范围可以就直接用了。

    将铁轨进行标记,对d数组进行初始化,并先入队列(刚开始想先求只有公路的最短路,最后考虑铁轨的思路 错误,因为可能有的城市最短路要经过铁路),然后SPFA啦,若是铁路的边被松弛,则对其进行标记,关闭这条铁轨。最后统计判断存在的铁轨数,将原铁轨数减去它就行了。

    //yy:最近习惯用链式前向星,结果TLE了,想了想不对劲复杂度没问题啊,,后来经过各种折磨,换成vector存图就AC了,好气啊、姿势老错。。

    //补题: AC by lyy

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<iostream>
    #include<string>
    #include<cmath>
    #include<queue>
    #include<limits.h>
    #define CLR(a,b) memset((a),(b),sizeof((a)))
    using namespace std;
    typedef long long ll;
    const int mod = 1e9+7;
    const int N = 1e5+5;
    const int M = 3e5+5;
    const ll inf = 0x3f3f3f3f3f3f3f3f;
    struct node {
        int v;
        int w;
    }E[2*M];
    vector<node> ve[N];
    
    int n, m, k;
    
    ll d[N];
    bool vis[N];
    bool train[N];//是否为铁路
    
    queue<int> q;
    void spfa() {
        while(!q.empty()) {
            int u = q.front(); q.pop();
            vis[u] = 0;
            for(int i = 0; i < ve[u].size(); ++i) {
                int v = ve[u][i].v;
                int w = ve[u][i].w;
                if(d[v] >= d[u] + w) {
                    d[v] = d[u] + w;
                    if(train[v]) {
                        train[v] = false;//关闭这个铁轨
                    }
                    if(!vis[v]) {
                        vis[v] = true;
                        q.push(v);
                    }
                }
            }
        }
    }
    int main() {
        CLR(vis, 0);
        CLR(train, 0);
        int i, j;
        int u, v, w;
        scanf("%d%d%d", &n, &m, &k);
        for(i = 1; i <= n; ++i) {
            d[i] = inf;
        }
        d[1] = 0; vis[1] = 1;
        q.push(1);
    
        for(i = 1; i <= m; i ++) {
            scanf("%d%d%d", &u, &v, &w);
            ve[u].push_back(node{v, w});
            ve[v].push_back(node{u, w});
        }
    
        for(i = 1; i <= k; ++i) {
            scanf("%d%d", &v, &w);
            train[v] = true;
            if(d[v] > w) {
                d[v] = w;
                if(!vis[v]) {
                    q.push(v);
                    vis[v] = true;
                }
            }
    
        }
        spfa();
        for(i = 1; i <= n; ++i) {
            if(train[i]) k--;
        }
        printf("%d
    ", k);
        return 0;
    }

    其他题都还做不出来,补都补不动orz

  • 相关阅读:
    如何从ORACLE数据库生成HBM和JAVA
    timer
    工作流研究
    linux date命令设置时间
    耶基斯多得森曲线
    朋友考我的一个基础语法题
    微软企业库(一)
    标记属性
    Word自动化撤销、重做功能
    汇编中的ASSUME
  • 原文地址:https://www.cnblogs.com/GraceSkyer/p/6702111.html
Copyright © 2020-2023  润新知