GZU Monthly, December 2014

A.雨天

dfs的简单运用

#include <map>
#include <queue>
#include <stack>
#include <math.h>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
#include <functional>
using namespace std;
#define maxn 1005
int a[maxn][maxn];
int ans1,ans2;
int n,m;
void dfs(int x,int y)
{
    a[x][y]=2;
    if (x-1>=0){
        if (a[x-1][y]==1){
            ans1++;
            dfs(x-1,y);
        } else if (a[x-1][y]==0) ans2++;
    } else ans2++;
    if (x+1<n){
        if (a[x+1][y]==1){
            ans1++;
            dfs(x+1,y);
        } else if (a[x+1][y]==0) ans2++;
    } else ans2++;
    if (y-1>=0){
        if (a[x][y-1]==1){
            ans1++;
            dfs(x,y-1);
        } else if (a[x][y-1]==0) ans2++;
    } else ans2++;
    if (y+1<m){
        if (a[x][y+1]==1){
            ans1++;
            dfs(x,y+1);
        } else if (a[x][y+1]==0) ans2++;
    } else ans2++;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(scanf("%d%d",&n,&m)!=EOF){
        memset(a,0,sizeof(a));
        for (int i=0;i<n;i++){
            char ss[maxn];
            scanf("%s",ss);
            for (int s=0;s<m;s++){
                a[i][s]=ss[s]-'0';
            }
        }
        int ans11=0,ans22=0;
        for (int i=0;i<n;i++){
            for (int s=0;s<m;s++){
                if (a[i][s])
                {
                    ans1=1,ans2=0;
                    dfs(i,s);
                    ans11=max(ans11,ans1);
                    ans22=max(ans22,ans2);
                }
            }
        }
        printf("%d %d\n",ans11,ans22);
    }
}

B.ACM的规则

简单贪心算法

首先对做出每题所花的时间重小到大排序,算出最好的成绩,再倒过来排序算出最差成绩即可

需要注意的是,这里的提交次数是总提交次数,错误的提交才会有罚时加20钟,所以你需要用总提交次数减去正确做出的题目数

另外,这里的时间是每题做出来所需时间,不是做出该题的时间

#include <bits/stdc++.h>
using namespace std;
int cmp(int xx,int yx)
{
    return xx>yx;
}
int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int x,y;
    int a[15];
    while(scanf("%d%d",&x,&y)!=EOF){
        for (int i=0;i<x;i++){
            scanf("%d",&a[i]);
        }
        sort(a,a+x);
        int ans=0,b=0;
        for (int i=0;i<x;i++){
            b+=a[i];
            ans+=b;
        }
        printf("%d ",ans+(y-x)*20);
        sort(a,a+x,cmp);
        ans=0,b=0;
        for (int i=0;i<x;i++){
            b+=a[i];
            ans+=b;
        }
        printf("%d\n",ans+(y-x)*20);
    }
    return 0;
}


C.无聊算算

这题是codeforces上的一道原题

codeforces Round #276 (div 2) D题

预处理出离算出自己最近的左边的一个点的值即可

#include <bits/stdc++.h>
using namespace std;
#define maxn 200005
int a[maxn];
int d[maxn*10];
int na[maxn*10];
int main()
{
    memset(d,0,sizeof(d));
    int n;scanf("%d",&n);
    for (int i=0;i<n;i++){
        scanf("%d",&a[i]);
        d[a[i]]=1;
    }
    for (int i=1;i<=2000000;i++){
        if (d[i-1]) na[i]=i-1;
        else na[i]=na[i-1];
    }
    int ans=0;
    for (int i=2;i<1000000;i++){
        if (d[i]&&ans<(i-1)){
            for (int s=i*2;s<1000000+i;s+=i){
                    ans=max(ans,na[s]%i);
                    if (ans==i-1) break;
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}



D.国王的奖励

这题是巫泽俊的书上面矩阵幂题目的翻版,几乎可以套用上面的代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vec;
typedef vector<vec> mat;
#define maxn 1000000007
ll x,y,z,aa,b,c;
mat mul(mat &a,mat &b)
{
    mat c(a.size(),vec(b[0].size()));
    for (int i=0;i<a.size();i++){
        for (int k=0;k<b.size();k++){
            for (int j=0;j<b[0].size();j++){
                c[i][j]=(c[i][j]+(a[i][k]*b[k][j])%maxn)%maxn;
            }
        }
    }
    return c;
}
mat pow(mat a,ll n)
{
    mat b(a.size(),vec(a.size()));
    for (int i=0;i<a.size();i++){
        b[i][i]=1;
    }
    while(n>0){
        if (n&1) b=mul(b,a);
        a=mul(a,a);
        n>>=1;
    }
    return b;
}
ll solve(ll n)
{
    mat a(3,vec(3));        //指定横纵坐标的大小
    a[0][0]=aa;a[0][1]=b;a[0][2]=c;
    a[1][0]=1;a[1][1]=0;a[1][2]=0;
    a[2][0]=0;a[2][1]=1;a[2][2]=0;
    a=pow(a,n);
    return ( (a[0][0]*x)%maxn + (a[0][1]*y)%maxn + (a[0][2]*z)%maxn )%maxn;
}
int main()
{
    ll n;
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    while(~scanf("%I64d",&n)){
        scanf("%I64d%I64d%I64d%I64d%I64d%I64d",&x,&y,&z,&aa,&b,&c);
        if (n==3){
            printf("%d\n",x);
            return 0;
        }
        if (n==2){
            printf("%d\n",y);
            return 0;
        }
        if (n==1){
            printf("%d\n",z);
            return 0;
        }
        printf("%I64d\n",solve(n-3));
    }
    return 0;
}

E.激动的比赛

约瑟夫环问题,没得啥好说的了,数学题,具体数学的书上看参考答案

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    ll n;
    while(~scanf("%I64d",&n)){
        ll len=0;
        ll ans=0;
        ll data=1;
        for (ll i=0;i<63;i++){
            if ((data<<i)>n){
                len=i-1;
                break;
            }
        }
        ans=(n-(data<<len));
        printf("%I64d\n",(ans<<data)+data);
    }
    return 0;
}

F.画圈圈诅咒出题人

搞笑题,暴力算一次就可以了

#include <bits/stdc++.h>
using namespace std;
#define maxn 1005
typedef long long ll;
struct node
{
    int x,y;
};
int main()
{
    int n;
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    while(~scanf("%d",&n)){
        node a[maxn];
        for (int i=0;i<n;i++){
            scanf("%d%d",&a[i].x,&a[i].y);
        }
        ll sum=0;
        for (int i=0;i<n;i++){
            for (int s=i;s<n;s++){
                sum=max(sum,(ll)((a[i].x-a[s].x)*(a[i].x-a[s].x)+(a[i].y-a[s].y)*(a[i].y-a[s].y)));
            }
        }
        printf("%I64d\n",sum);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值