首页 > 代码库 > 江西理工大学南昌校区2016年新生赛

江西理工大学南昌校区2016年新生赛

潘神的排序

解法:排序(什么为什么错了这么多次QAQ??解法就是排序啊)

sort(a,a+3)
cout<<a[1]<<endl;

字符串解压

解法:字符串处理(处理字符串中的数字就好了,代码给出)

(当然可以用%d%c来快速处理~)

注意:如果题目是反过来告诉字符串,让你压缩会怎么办?

        for(i=0;i<k;i++)
        {
            if(a[i]>=‘0‘&&a[i]<=‘9‘)
            {
                c=(a[i]-‘0‘)+c*10;continue;
            }
            else
            {
                for(j=1;j<=c;j++)
            printf("%c",a[i]);
           c=0;
           }
        }

lfforu的围巾

解法:答案不给出,母函数模板(不懂的去查他的模板,大概就是我下面写的那样,注意取模)

        for(int i=0;i<=n;i++)
        {
            a[i]=1;
            b[i]=0;
        }
        for(int i=2;i<=n;i++)
        {
            for(int j=0;j<=n;j++)
            {
                for(int k=0;k+j<=n;k+=i*i)
                {
                    b[k+j]+=a[j];
                }
            }
            for(int z=0;z<=n;z++)
            {
                a[z] = b[z]%mod;
                b[z] = 0;
            }
        }
        cout<<a[n]<<endl;

  

不要你离开

解法:难度我猜不在于算出概率,算概率只有去判断一下就好了

化简可以用公约数~(暴力求出所有解法也是可以的,如下面的形式)

    if(a>=b)
        max=a;
    else
        max=b;
    if(max==1)
        printf("1/1");
    if(max==2)
        printf("5/6");
    if(max==3)
        printf("2/3");
    if(max==4)
        printf("1/2");
    if(max==5)
        printf("1/3");
    if(max==6)
        printf("1/6");

屏幕检测

解法:模拟,如果让你求0011000111000 有多少个连续的1,估计题目有容易的多

现在变成二维形式,还是一样的解法

我们加边界,当出现*时,判断左边是否有.,右边时候有*,或者说单独存在这一个*,统计一下

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;
string s[105];
int main(){
    int n,m;
    for(int i=0;i<=105;i++){
        s[0]+=‘.‘;
    }
    while(cin>>n>>m){
        for(int i=1;i<=n;i++){
            cin>>s[i];
            s[i]=‘.‘+s[i]+‘.‘;
        }
        s[n+1]=s[0];
        int cnt1=0,cnt2=0;
        for(int i=1;i<=n;i++){
            for(int k=1;k<=m;k++){
                if(s[i][k]==‘*‘){
                    if(s[i-1][k]==‘.‘ && s[i+1][k]==‘*‘){
                        cnt1++;
                    }
                    if(s[i][k-1]==‘.‘ && s[i][k+1]==‘*‘){
                        cnt1++;
                    }
                    if(s[i-1][k]==‘.‘ && s[i+1][k]==‘.‘ && s[i][k-1]==‘.‘ && s[i][k+1]==‘.‘){
                        cnt2++;
                    }
                }
            }
        }
        cout<<cnt2<<" "<<cnt1<<endl;
    }
}

袁少的觉醒

解法:参考http://www.cnblogs.com/yinghualuowu/p/5160313.html

疯狂的南昌小婊砸

解法:时间原因不知道怎么去说明白,先略过吧>~<

贪财的小艾

解法:一道模拟或者说是LCA。。(防ak题嘛,你懂得)

用map放每一个节点的对应边的权值,然后进行更新或者查询(具体看题目要求)

是不是说的有点简单了。

#include <bits/stdc++.h>
using namespace std;
#define ll long long

map<pair<ll,ll>,ll>m;


int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        ll ty,u,v,w;
        scanf("%I64d",&ty);
        if(ty==1)
        {
            scanf("%I64d%I64d%I64d",&u,&v,&w);
            if(v<u)swap(u,v);
            while(v!=u)
            {
                if(v>u)
                {
                    m[{v,v/2}]+=w;
                    m[{v/2,v}]+=w;
                    v/=2;
                }
                else if(u>v)
                {
                    m[{u,u/2}]+=w;
                    m[{u/2,u}]+=w;
                    u/=2;
                }
            }
        }
        else
        {
            ll sum=0;
            scanf("%I64d%I64d",&u,&v);
            if(v<u)swap(u,v);
            while(v!=u)
            {
                if(v>u)
                {
                    sum+=m[{v,v/2}];
                    v/=2;
                }
                else if(u>v)
                {
                    sum+=m[{u,u/2}];
                    u/=2;
                }
            }
            printf("%I64d\n",sum);
        }
    }
    return 0;
}

  

江西理工大学南昌校区2016年新生赛