Codeforces1130

A.Be Positive

题意:给定一个数列,求数列中一半及以上的数是正数、负数还是零。

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN=100+2;
int a,b,N;

int main(){
    cin >> N;
    for(int i=1,x;i<=N;i++){
        cin >> x;
        if(x>0) a++;
        if(x<0) b++;
    }

    if(2*a>=N) cout << 1 << endl;
    else if(2*b>=N) cout << -1 << endl;
    else cout << 0 << endl;

    return 0;
}
View Code

B. Two Cakes

题意:给定一个由两组1~N构成的数列,规定两个数a[i],a[j]之间的距离为|i-j|,求两条从1N的路径,使得距离和最短。

题解:设f[i][0/1]为前i层蛋糕,第一个人到更靠左/右的i位置(相对的,第二个人就去另一个位置),所需要的最小花费,转移方程显然略。

代码:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define ll long long

const int MAXN=100000+2;
int N;
ll p[MAXN][2],f[MAXN][2];

int main(){
    cin >> N;
    for(int i=1,x;i<=2*N;i++){
        cin >> x;
        if(p[x][0]) p[x][1]=i;
        else p[x][0]=i;
    }
    p[0][0]=p[0][1]=1;

    for(int i=1;i<=N;i++){
        f[i][0]=min(f[i-1][0]+abs(p[i-1][0]-p[i][0])+abs(p[i-1][1]-p[i][1]),f[i-1][1]+abs(p[i-1][1]-p[i][0])+abs(p[i-1][0]-p[i][1]));
        f[i][1]=min(f[i-1][0]+abs(p[i-1][0]-p[i][1])+abs(p[i-1][1]-p[i][0]),f[i-1][1]+abs(p[i-1][1]-p[i][1])+abs(p[i-1][0]-p[i][0]));
    }
    cout << min(f[N][0],f[N][1]) << endl;

    return 0;
}
View Code

C. Connect

题意:给定一个图,有的位置不能通过,定义两位置间的距离为欧式距离,若两位置间有通道(花费为两者间距离,只能建一个通道),则可直接通过。求从起点到终点存在合法路径时,建通道的最小花费。

题解:数据范围很小,染色之后暴力找。

代码:

#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN=100+2;
const int X[]={-1,0,1,0};
const int Y[]={0,1,0,-1};
int x1,y1,x2,y2;
int N,g[MAXN][MAXN],Ans;
bool Flag[MAXN][MAXN];
char S[MAXN];

int Calc(int a,int b,int c,int d){ return (c-a)*(c-a)+(d-b)*(d-b);}

bool Check(int x,int y){
    if(!x || !y) return 0;
    if(x>N || y>N) return 0;
    if(Flag[x][y]) return 0;
    return g[x][y]!=1;
}

void DFS(int x,int y,int t){
    if(t==-1 && x==x2 && y==y2){
        cout << 0 << endl;
        exit(0);
    }

    Flag[x][y]=1,g[x][y]=t;
    for(int i=0,tx,ty;i<4;i++){
        tx=x+X[i],ty=y+Y[i];
        if(Check(tx,ty)) DFS(tx,ty,t);
    }
}

int main(){
    cin >> N;
    cin >> x1 >> y1 >> x2 >> y2;
    for(int i=1;i<=N;i++){
        scanf("%s",S+1);
        for(int j=1;j<=N;j++) g[i][j]=S[j]-'0';
    }

    Ans=INT_MAX;
    DFS(x1,y1,-1),DFS(x2,y2,2);

    for(int a=1;a<=N;a++)
        for(int b=1;b<=N;b++){
            if(g[a][b]!=-1) continue;
            for(int c=1;c<=N;c++)
                for(int d=1;d<=N;d++){
                    if(g[c][d]!=2) continue;
                    Ans=min(Ans,Calc(a,b,c,d));
                }
        }
    cout << Ans << endl;

    return 0;
}
View Code

D. Toy Train

题意:给定一个环,只能单向前进。每个节点有一些货物要运到另外一些节点,每经过一个节点,只能上一个货,但能下任意数量的货,且火车容量无限,求运输完所有货物所需的最少时间。

题解:由于每次只能上一个货,因此最后下的货物一定是在货物数量最多的节点上的,而一个节点i所决定的最优时间为min{dis(起点,i)+(c[i]-1)*N+(i的一个货物到它终点的距离)},答案为这些最优时间中的最大值。

代码:

#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;

const int MAXN=100+2;
const int MAXM=200+2;
int N,M,a[MAXN][MAXM],Ans;

int Calc(int x,int y){
    if(x==y) return 0;
    if(y>x) return y-x;
    return N-x+y;
}

int main(){
    cin >> N >> M;
    for(int i=1,x,y;i<=M;i++){
        cin >> x >> y;
        a[x][++a[x][0]]=y;
    }

    for(int i=1;i<=N;i++){
        Ans=0;
        for(int j=1,t=-1;j<=N;j++,t=-1){
            for(int k=1;k<=a[j][0];k++){
                if(t==-1) t=Calc(i,j)+(a[j][0]-1)*N+Calc(j,a[j][k]);
                else t=min(t,Calc(i,j)+(a[j][0]-1)*N+Calc(j,a[j][k]));
            }
            Ans=max(Ans,t);
        }
        cout << Ans << " ";
    }

    return 0;
}
View Code

E. Wrong Answer

(待补)

Be Positive

猜你喜欢

转载自www.cnblogs.com/WDZRMPCBIT/p/10438150.html