首页 > 代码库 > Mutual Training for Wannafly Union #2

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\n",ans);    else    printf("-1\n");    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\n"); 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\n"); 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\n%lld\n", a[1]);}             else if((d1 % 2 == 0) &&  n == 2 ) { printf("3\n%lld %lld %lld\n", a[1]-d1, a[1]+d1/2, a[n]+d1); }        else { printf("2\n%lld %lld\n", a[1]-d1, a[n]+d1); }    }    else {  //f = 2        if(d2 == 2*d1 && cnt2 == 1) {            if(ff == 1)            printf("1\n%lld\n", a[k]-d1);            else printf("1\n%lld\n", a[k-1]-d1);        }        else printf("0\n");    }    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\n", k);    return 0;}

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

Mutual Training for Wannafly Union #2