首页 > 代码库 > codeforces 821

codeforces 821

A

给你一个n*n矩阵

判断不是1的数 能不能有 同一行 + 同一列的  一个数 相加得到   暴力下就行

技术分享
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>

using namespace std;

#define inf 1e9+7
#define MAXN  100
#define long long ll

int z[MAXN][MAXN];

int main()
{

    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
                scanf("%d",&z[i][j]);
        }
        int ok=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(z[i][j]!=1)
                {
                    int a=0;
                    for(int k=1;k<=n;k++)
                    {
                        if(k==i)
                            continue;
                        z[k][j];
                        for(int kk=1;kk<=n;kk++)
                        {
                            if(kk==j)
                                continue;
                            if(z[k][j]+z[i][kk]==z[i][j])
                                a=1;
                        }
                    }
                    if(a==0)
                        ok=1;
                }
            }
        }
        if(ok==0)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}
View Code

B

y= - x/m+b

求最大的矩阵的权值   矩阵权值计算方法是  每个点的x y 都加起来

暴力跑下x   0*m  1*m    ... 

然后推一下矩阵权值

(x+1)*(y+1)*(x+y)/2

求max

技术分享
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>

using namespace std;

#define inf 1e9+7
#define MAXN  100
#define ll __int64


int main()
{
    ll m,b;

    while(scanf("%I64d%I64d",&m,&b)!=EOF)
    {

        ll ans=0;
        for(int i=0;;i++)
        {
            ll y=-i+b;
            ll x=i*m;
            if(y>=0)
            {
                ans=max(ans,(i*m+1)*(y+1)*(i*m+y)/2);
            }
            else
                break;
        }
        printf("%I64d\n",ans);
    }

    return 0;
}
View Code

C

n   然后2*n个操作 

add  a 代表  把a加到栈里面 

remove  代表出栈 

要求是出栈顺序是 1 ~ n  可以用一个费用   然后让栈排序  求最小费用

要出栈的话    如果栈顶不对  那么  显然费用要加

那么  都排序了  其实就可以把栈里的数去掉了 他们不再要费用 

技术分享
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
#include<stack>

using namespace std;

#define inf 1e9+7
#define MAXN  100
#define ll __int64

stack<int>s1;

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int to;
        int ans=0;
        int c1=0;

        for(int i=1;i<=n*2;i++)
        {
            char z[10];
            scanf("%s",z);
            if(z[0]==a)
            {
                int a;
                scanf("%d",&a);
                s1.push(a);
            }
            else
            {
                c1++;
                if(s1.empty())
                    continue;
                if(s1.top()==c1)
                    s1.pop();
                else
                {
                    ans++;
                    while(!s1.empty())
                        s1.pop();
                }
            }
        }
        printf("%d\n",ans);
    }


    return 0;
}
View Code

D

n m k

n*m 地图  然后k   个 x y

这些点如果相邻的话可以直接点

可以用一个花费   点亮一行或者一列  

求从左上走到右下 最小花费

spfa    ...

技术分享
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
#include<stack>
#include<deque>
#include<math.h>

using namespace std;

#define inf 1e9+7
#define MAXN  10100
#define ll __int64

struct node
{
    int x,y;
}z[MAXN];
int n,m,q;
deque<int>q1;
bool vis[MAXN];
int  d[MAXN];

int spfa()
{
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=q;i++)
        d[i]=inf;
    d[1]=0;
    vis[1]=1;
    q1.push_back(1);
    while(!q1.empty())
    {
        int now=q1.front();
        q1.pop_front();
        vis[now]=0;
        for(int i=1;i<=q;i++)
        {
            if(i==now)
                continue;
            int dx=abs(z[i].x-z[now].x);
            int dy=abs(z[i].y-z[now].y);
            int w=inf;
            if(dx+dy<=1)
                w=0;
            else if(dx<=2||dy<=2)
                w=1;
            if(d[now]+w<d[i])
            {
                d[i]=d[now]+w;
                if(!vis[i])
                {
                    if(q1.empty())
                        q1.push_back(i);
                    else
                    {
                        if(d[q1.front()]>d[i])
                            q1.push_front(i);
                        else
                            q1.push_back(i);
                    }
                    vis[i]=1;
                }
            }
        }
    }
    if(d[q]==inf)
        return -1;
    return d[q];
}

int main()
{

    while(scanf("%d%d%d",&n,&m,&q)!=EOF)
    {
        int a=0;
        for(int i=1;i<=q;i++)
        {
            scanf("%d%d",&z[i].x,&z[i].y);
            if(z[i].x==n&&z[i].y==m)
                a=1;
        }
        if(a==0)
        {
            q++;
            z[q].x=n+1;
            z[q].y=m+1;
        }
        printf("%d\n",spfa());

    }
    return 0;
}
View Code

 

codeforces 821