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

原文地址:https://www.cnblogs.com/GraceSkyer/p/6702111.html