codeforces.com/contest/793

补一场CF http://codeforces.com/contest/793
A

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>

using namespace std;

const int MAXN=1e5+5;
int cost[MAXN];

int main()
{
    int n,k,minn=1e9;long long ans=0;bool flag=false;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&cost[i]);
        minn=min(minn,cost[i]);
    }
    for(int i=0;i<n;i++){
        ans+=(cost[i]-minn)/k;
        if((cost[i]-minn)%k){
            flag=true;
            break;
        }
    }
    printf("%I64d\n",flag?-1:ans);
    return 0;
}

B
没注意细节导致wa了

#include<cstdio>
#include<cstring>

using namespace std;

const int ox[]={0,0,-1,1};
const int oy[]={1,-1,0,0};

const int MAXN=1e3+1e2;
char mp[MAXN][MAXN];
int  dp[MAXN][MAXN];
int n,m,sx,sy,ex,ey;

inline void dfs(int X,int Y,int o){
    for(int i=0;i<4;i++){
        int x=X+ox[i],y=Y+oy[i],now=(i==o?dp[X][Y]:dp[X][Y]+1);
        if(0<=x&&x<n&&0<=y&&y<m&&mp[x][y]=='.'&&now<=dp[x][y]&&now<=2){
            if(now<dp[x][y]){
                dp[x][y]=now;
                dfs(x,y,i);
                continue;
            }
            while(0<=x&&x<n&&0<=y&&y<m&&mp[x][y]=='.'&&now==dp[x][y]){          
                x=x+ox[i],y=y+oy[i];
                if(0<=x&&x<n&&0<=y&&y<m&&mp[x][y]=='.'&&now<dp[x][y]&&now<=2){
                    dp[x][y]=now;
                    dfs(x,y,i);
                    break;
                }
            }
        }
    }
}

int main()
{
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%s",mp[i]);
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(mp[i][j]=='S'){
                sx=i,sy=j;
            }else if(mp[i][j]=='T'){
                ex=i,ey=j;
                mp[i][j]='.';
            }
        }
    }
    memset(dp,0x3f,sizeof(dp));
    dp[sx][sy]=0;
    for(int i=0;i<4;i++){
        dfs(sx,sy,i);
    }
    puts(dp[ex][ey]<=2?"YES":"NO");
    return 0;
}

C
EPS取 1e-20导致wa了,没仔细读题导致wa了,没考虑好边界情况wa了
(QAQ 我怎么这么弱

#include<cstdio>
#include<algorithm>
using namespace std;

const int MAXN=1e5+1e2;

double x1,x2,y1,y2;int n;

double x[MAXN],y[MAXN],vx[MAXN],vy[MAXN];
const double e=1.0;
const double EPS=1e-12;

double fabs(double a){
    return a<0.0?-a:a;
}

void gett(int i,double &mint,double &maxt){
    mint=1e9,maxt=-1e9;
    double t;
    if(x1<x[i]&&x[i]<x2&&y1<y[i]&&y[i]<y2){
        mint=1e-9;
        if(vx[i]==0.0&&vy[i]==0.0) maxt=1e12;
        else if(vx[i]==0.0) maxt=max((y1-y[i])/vy[i],(y2-y[i])/vy[i]);
        else if(vy[i]==0.0) maxt=max((x1-x[i])/vx[i],(x2-x[i])/vx[i]);
        else maxt=min(max((y1-y[i])/vy[i],(y2-y[i])/vy[i]),max((x1-x[i])/vx[i],(x2-x[i])/vx[i]));
        return ;
    }

    if(vx[i]==0.0&&vy[i]!=0.0&&(x[i]==x1||x[i]==x2)||
       vy[i]==0.0&&vx[i]!=0.0&&(y[i]==y1||y[i]==y2)
    ) {mint=1e9; return;}

    if(vx[i]!=0.0) t=e*(x1-x[i])/vx[i]; else t=0.0;
    if(t>=0.0&&x1-EPS<=x[i]+t*vx[i]&&x[i]+t*vx[i]<=x2+EPS&&y1-EPS<=y[i]+t*vy[i]&&y[i]+t*vy[i]<=y2+EPS){
        mint=min(mint,t);
        maxt=max(maxt,t);
    }

    if(vx[i]!=0.0) t=e*(x2-x[i])/vx[i]; else t=0.0;
    if(t>=0.0&&x1-EPS<=x[i]+t*vx[i]&&x[i]+t*vx[i]<=x2+EPS&&y1-EPS<=y[i]+t*vy[i]&&y[i]+t*vy[i]<=y2+EPS){
        mint=min(mint,t);
        maxt=max(maxt,t);
    }

    if(vy[i]!=0.0) t=e*(y1-y[i])/vy[i]; else t=0.0;
    if(t>=0.0&&x1-EPS<=x[i]+t*vx[i]&&x[i]+t*vx[i]<=x2+EPS&&y1-EPS<=y[i]+t*vy[i]&&y[i]+t*vy[i]<=y2+EPS){
        mint=min(mint,t);
        maxt=max(maxt,t);
    }

    if(vy[i]!=0.0) t=e*(y2-y[i])/vy[i]; else t=0.0;
    if(t>=0.0&&x1-EPS<=x[i]+t*vx[i]&&x[i]+t*vx[i]<=x2+EPS&&y1-EPS<=y[i]+t*vy[i]&&y[i]+t*vy[i]<=y2+EPS){
        mint=min(mint,t);
        maxt=max(maxt,t);
    }
}

int main()
{
    scanf("%d%lf%lf%lf%lf",&n,&x1,&y1,&x2,&y2);
    for(int i=0;i<n;i++){
        scanf("%lf%lf%lf%lf",&x[i],&y[i],&vx[i],&vy[i]);
    }
    double mint=-1e9,maxt=1e12,tmpmint,tmpmaxt;
    for(int i=0;i<n;i++){
        gett(i,tmpmint,tmpmaxt);
        mint=max(mint,tmpmint);
        maxt=min(maxt,tmpmaxt);
    }
    if(mint>=maxt-EPS||mint<EPS) puts("-1");
    else printf("%0.20f",mint);
    return 0;
}

D
看了别人的思想,然后一直在调for。。。。不压缩代码了 方便理解
复杂度 O(kn3)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>

using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=82;

int dp[MAXN][MAXN][MAXN],w[MAXN][MAXN],n,m,k;

int work(){
    if(k==1) return 0;
    for(int i=2;i<k;i++){
        for(int j=0;j<=n+1;j++){
            for(int u=j+1;u<=n+1;u++){
                if(dp[i-1][j][u]!=INF){
                    for(int t=j+1;t<u;t++){
                        if(w[u][t]!=INF){
                            dp[i][u][t]=min(dp[i][u][t],dp[i-1][j][u]+w[u][t]);
                            dp[i][j][t]=min(dp[i][j][t],dp[i-1][j][u]+w[u][t]);
                        }
                    }
                }
                if(dp[i-1][u][j]!=INF){
                    for(int t=j+1;t<u;t++){
                        if(w[j][t]!=INF){
                            dp[i][j][t]=min(dp[i][j][t],dp[i-1][u][j]+w[j][t]);
                            dp[i][u][t]=min(dp[i][u][t],dp[i-1][u][j]+w[j][t]);
                        }
                    }
                }
            }
        }
    }
    int res=INF;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            res=min(res,dp[k-1][i][j]);
        }
    }
    return res;
}

int main()
{
    memset(dp,0x3f,sizeof(dp));
    memset(w ,0x3f,sizeof(w) );
    scanf("%d%d%d",&n,&k,&m);
    for(int i=0;i<m;i++){
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        if(x==y) continue;
        w[x][y]=dp[1][x][y]=min(w[x][y],c);
        if(x<y) dp[1][n+1][y]=min(w[x][y],dp[1][n+1][y]);
        else    dp[1][0][y]=min(w[x][y],dp[1][0][y]);
    }
    int ans=work();
    printf("%d\n",ans<INF?ans:-1);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值