华南农业大学2020初出茅庐题解

这里写自定义目录标题


H题 水题无疑

#include<iostream>
using namespace std;
int main(){
    long long int n;cin>>n;
    int tempn=n-1;
    long long int k=(n*tempn)/2;
    cout<<k;
    return 0;
} 

B题 同样水题无疑 ,问题问能否整除,显然可以知道,整除的前提是需要零,又有常识0除任何数为零

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int a[10];
int main(){
    int n;cin>>n;
    int k;
    while(n--){
        cin>>k;
        a[k]++;
    }
    if(a[0]){
        cout<<"Yes";
    }
    else{
        cout<<"No";
    }
    return 0;
} 

A题 题目告知很明显。按要求模拟即可。需要自己尝试调试样例没给出的操作

#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<queue>
using namespace std;
char a [105][105];
int n;
char judge(int k,int i){
    if(a[k][i]>='a'&&a[k][i]<='z')
    {
        a[k][i]-=('a'-'A');
    }
    else {
        a[k][i]+=('a'-'A');
    }
        return a[k][i];
}
void clockwise_rotation(int k){
    if(k==(n+1)/2&&(n%2)){
        a[k][k]=judge(k,k);
    }
    char t1=judge(k,k),t2=judge(k,n-k+1),t3=judge(n-k+1,k),t4=judge(n-k+1,n-k+1);
    a[k][k]=t3;a[k][n-k+1]=t1;a[n-k+1][k]=t4;a[n-k+1][n-k+1]=t2;
    queue<char>one,two,three,four;
    for(int i=k+1;i<=n-k;i++){
        one.push(judge(k,i));
    }
     for(int i=k+1;i<=n-k;i++){
        two.push(judge(i,n-k+1));
    }
    for(int i=k+1;i<=n-k;i++){
        three.push(judge(n-k+1,i));
    }
    for(int i=k+1;i<=n-k;i++){
        four.push(judge(i,k));
    }
    for(int i=k+1;i<=n-k;i++){
        a[i][n-k+1]=one.front();
        one.pop();
    }
    for(int i=n-k;i>=k+1;i--){
        a[n-k+1][i]=two.front();
        two.pop();
    } 
    for(int i=k+1;i<=n-k;i++){
        a[i][k]=three.front();
         three.pop();
    }
    for(int i=n-k;i>=k+1;i--){
        a[k][i]=four.front();
        four.pop();
    }
}
void anticlockwise_rotation(int k){
    char t1=judge(k,k),t2=judge(k,n-k+1),t3=judge(n-k+1,k),t4=judge(n-k+1,n-k+1);
    a[k][k]=t2;a[k][n-k+1]=t4;a[n-k+1][k]=t1;a[n-k+1][n-k+1]=t3;
    queue<char>one,two,three,four;
    for(int i=k+1;i<=n-k;i++){
        one.push(judge(k,i));
    }
    for(int i=k+1;i<=n-k;i++){
        two.push(judge(i,n-k+1));
    }
    for(int i=k+1;i<=n-k;i++){
        three.push(judge(n-k+1,i));
    }
    for(int i=k+1;i<=n-k;i++){
        four.push(judge(i,k));
    }
    for(int i=n-k;i>=k+1;i--){
        a[i][n-k+1]=three.front();
        three.pop();
    }
    for(int i=k+1;i<=n-k;i++){
        a[n-k+1][i]=four.front();
        four.pop();
    }
    for(int i=n-k;i>=k+1;i--){
        a[i][k]=one.front();
        one.pop();
    }
    for(int i=k+1;i<=n-k;i++){
        a[k][i]=two.front();
        two.pop();
    }
}
void left_shift(int k){
    char temp=judge(k,1);
    for(int i=1;i<n;i++){
        a[k][i]=judge(k,i+1);
    }
    a[k][n]=temp;
}
void right_shift(int k){
    char temp=judge(k,n);
    for(int i=n;i>1;i--){
        a[k][i]=judge(k,i-1);
    }
    a[k][1]=temp;
}
void upper_shift(int k){
    char temp=judge(1,k);
    for(int i=1;i<n;i++){
        a[i][k]=judge(i+1,k);
    }
    a[n][k]=temp;
}
void down_shift(int k){
    char temp=judge(n,k);
    for(int i=n;i>1;i--){
        a[i][k]=judge(i-1,k);
    }
    a[1][k]=temp;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j]; 
        }
    }
    int m;cin>>m;
    while(m--){
        string s;cin>>s;
        int k;
        if(s=="clockwise_rotation"){
            cin>>k;
            clockwise_rotation(k);
        }
        else if(s=="anticlockwise_rotation"){
            cin>>k;
            anticlockwise_rotation(k);
        }
        else if(s=="left_shift"){
            cin>>k;
            left_shift(k);
        }
        else if(s=="right_shift"){
            cin>>k;
            right_shift(k);
        }
        else if(s=="upper_shift"){
            cin>>k;
            upper_shift(k);
        }
        else if(s=="down_shift"){
            cin>>k;
            down_shift(k);
        }
        else if(s=="print_it!"){
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    cout<<a[i][j];
                }
                cout<<endl;
            }
        }
    }
    return 0;
}

E题 这题呢我卡了挺久 后面按照全部都是1的情况开始模拟
结果写着写着就过了

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int t;cin>>t;
    while(t--){
        int finbook[10]={0};
        int a,n;cin>>a>>n;
        if(a<n*2||a>7*n){
            cout<<-1<<endl;
        }
        else{
            finbook[1]=n;
            for(int i=2*n;i<a;i++){
                int p=1;
                if(finbook[1]&&p==1){
                    finbook[1]--;
                    finbook[7]++;
                    p=0;
                }
                else if(finbook[5]&&p==1){
                    finbook[5]--;
                    finbook[9]++;
                    p=0;
                }
                else if(finbook[7]==3&&p==1){
                    finbook[7]=0;
                    finbook[1]+=2;
                    finbook[9]++;
                    p=0;
                }
                else if(finbook[7]==1&&finbook[4]==1&&p==1){
                    finbook[7]=0;
                    finbook[1]+=1;
                    finbook[4]=0;
                    finbook[9]++;
                    p=0;
                }
                else if(finbook[4]&&p==1){
                    finbook[4]--;
                    finbook[5]++;
                    p=0;
                }
                else if(finbook[7]&&p==1){
                    finbook[7]--;
                    finbook[4]++;
                    p=0;
                }
                else if(finbook[9]&&p==1){
                    finbook[9]--;
                    finbook[8]++;
                    p=0;
                }
                if(finbook[7]>3){
                    finbook[7]=0;
                    finbook[9]++;
                    finbook[1]+=3;
                    p=0;
                }
            }
            for(int i=9;i>0;i--){
                while(finbook[i]){
                    cout<<i;
                    finbook[i]--;
                }
            }
            cout<<endl;
        }
    }
    return 0;
}

C题 负责端茶递水的jinli
这题明显求最长公共子串,dp可以解决


#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[10005][10005];
char s1[10005],s2[10005];
int main(){
    scanf("%s",s1+1);
    scanf("%s",s2+1);
    int len1=strlen(s1+1);int len2=strlen(s2+1);
    for(int i=0;i<=len2;i++){
        for(int j=0;j<=len1;j++){
            if(i==0||j==0){
                a[i][j]=0;
            }
            else{
                if(s2[i]==s1[j]){
                    a[i][j]=a[i-1][j-1]+1;
                }
                else{
                    a[i][j]=0;
                } 
            }
        }
    }
    int maxnn=0;
    for(int i=0;i<=len2;i++){
        if(maxnn<a[i][len1]){
            maxnn=a[i][len1];
        }
    }
    if(maxnn==0){
        cout<<len1+len2;
    }
    else{
        cout<<len1-maxnn+len2-maxnn;
    }
    return 0;
}

D题 sen在玩塞尔达传说
也是模拟,这里我是直接面向百度编程。现学优先队列。

#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,k,l,p,numm;
struct wuqi{
    string name;
    int a;
    int b;
    int num;
    friend bool operator < (struct wuqi x,struct wuqi y){
        if(x.a==y.a){
           if(x.b==y.b){
               return x.num>y.num;
           }
           return x.b>y.b;
        }
        return x.a>y.a;
    }
}qq;
struct dun{
    string name;
    int c;
    int num;
    friend bool operator < (struct dun x,struct dun y){
        if(x.c==y.c){
            return x.num>y.num;
        }
        return x.c>y.c;
    }
}DD;
bool cmp1(wuqi t1,wuqi t2){
    return t1.num<t2.num;
}
bool cmp2(dun t1,dun t2){
    return t1.num<t2.num;
}
priority_queue<wuqi> wuqiku;
priority_queue<dun> dunku;
void fight(int bi,int yi ,int zi,int wi,string xi,string qi){
    wuqi tempwuqi;tempwuqi.b=-999;
    dun tempdun;tempdun.c=-999;
    bool flag=false;
    while(!wuqiku.empty()){
        while(tempwuqi.b<=0&&!(wuqiku.empty())){// 拿武器
            tempwuqi=wuqiku.top();
            wuqiku.pop();
            l++;
        }
        while(tempdun.c<=0&&!dunku.empty()){//拿盾
            tempdun=dunku.top();dunku.pop();
            p++;
        }
        bi-=tempwuqi.a;tempwuqi.b-=1;//打一下
        if(bi>0){//如果怪没有死,就会用盾去挡
            tempdun.c-=yi;
        }
        if(tempwuqi.b>0){//如果手上武器还有耐力就收起来
            wuqiku.push(tempwuqi);
            tempwuqi.b=-1;
            l--;
        }
        if(tempdun.c>0){//如果手上盾还有耐力就收起来
            dunku.push(tempdun);
            tempdun.c=-1;
            p--;
        }
        if(bi<=0){//如果怪死了
            if(wi){//如果有盾,收起来
                dun guaidun;guaidun.name=qi;guaidun.c=wi;guaidun.num=numm++;
                    if(p>0){
                        dunku.push(guaidun);
                        p--;
                    }
                    else if(p==0&&(!dunku.empty())){
                        if(dunku.top().c<=guaidun.c){
                            dunku.pop();
                            dunku.push(guaidun);
                        }
                    }
            }
            wuqi guaiwuqi;guaiwuqi.name=xi;guaiwuqi.a=yi;guaiwuqi.b=zi;guaiwuqi.num=numm++;
            if(l==0){//怪物必定有武器,那么判断是否还有位置放武器,这里0空间,则考虑是否替换最低武器
                if(wuqiku.top().a<guaiwuqi.a){
                    wuqiku.pop();
                    wuqiku.push(guaiwuqi);
                }
                else if(wuqiku.top().a==guaiwuqi.a){
                        if(wuqiku.top().b<=guaiwuqi.b){
                            wuqiku.pop();
                            wuqiku.push(guaiwuqi);
                        }
                }
            }
            else{//还有空间,收起怪物武器
                wuqiku.push(guaiwuqi);
                l--;
            }
            flag=true;//宣告怪物死亡
            break;
        }
    }
    if(!flag){//如果怪物没死,就是我没武器了,那么就是我死,那么清空盾库
            while(!dunku.empty()){
                dunku.pop();
            }
        }
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int t;cin>>t;
    while(t--){
        cin>>n>>m>>k>>l>>p;
        l=l-n;
        p=p-m;
        numm=1;
        while(n--){
            cin>>qq.name>>qq.a>>qq.b;
            qq.num=numm++;
            wuqiku.push(qq);
        }
        while(m--){
            cin>>DD.name>>DD.c;
            DD.num=numm++;
            dunku.push(DD);
        }
        while(k--){
            int bi,yi,zi,wi;
            string xi,qi;
            cin>>bi>>xi>>yi>>zi>>qi>>wi;
            fight(bi,yi,zi,wi,xi,qi);
        }
        int n1=wuqiku.size();
        int n2=dunku.size();
        cout<<n1<<endl;
        wuqi sumwuqi[30];
        for(int i=0;i<n1;i++){
            sumwuqi[i]=wuqiku.top();
            wuqiku.pop();
        }
        sort(sumwuqi,sumwuqi+n1,cmp1);
        for(int i=0;i<n1;i++){
            cout<<sumwuqi[i].name<<endl;
        }
        cout<<n2<<endl;
        dun sumdun[30];
        for(int i=0;i<n2;i++){
            sumdun[i]=dunku.top();
            dunku.pop();
        }
        sort(sumdun,sumdun+n2,cmp2);
        for(int i=0;i<n2;i++){
            cout<<sumdun[i].name<<endl;
        }
    }
    return 0;
}

G题 小弟弟的数学题
讲真,这题折磨我很久了,1e5,显然n^2不可以。所以我直接暴力对每个数都提取2和5的因数个数,用二维数组进行表示。然后二维前缀和来匹配是否进位。


Source Code

#include<iostream>
#include<queue>
using namespace std;
struct Zhengshu{
    int ans2=0;
    int ans5=0;
    int len=0;
};
int book2[50][50];
int sum2[50][50];
int book5[50][50];
int book[50];
int sum5[50][50];
int sumyu[50];
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int n;cin>>n;
    long long int zhengshu=0;
    long long int sum=0;
    int p2=0,p5=0;
    queue<Zhengshu> zs;
    for(int ii=0;ii<n;ii++){
        string s;cin>>s;
        int p=-1,p1=0;
        bool flag=false;//判断是否为小数
        long long int tempz=0,tempx=0;
        int len=s.length();
        for(int i=0;i<len;i++){
            if(s[i]=='.'){
                p=i;
                break;
            }
            else {
                tempz=tempz*10+s[i]-48;
            }
        }
        for(int i=len-1;i>=p;i--){
            if(s[i]=='0'){
                continue;
            }
            else if(s[i]!='.'&&!flag&&p!=-1){//遇到小数点后的非零数,代表为小数,
                flag=true;
                p1=i;//p1代表小数最后一位的下标
                break;
            }
        }
        if(flag){//如果是小数,就补小数为整数
            for(int i=0;i<=p1;i++){
                if(s[i]!='.'){
                    tempx=tempx*10+s[i]-48;
                }
                else{
                    p=i;
                }
            }
            //p1-p为小数点后长度
            int two=0,five=0;
            int weishu=p1-p;
            if(!(tempx%2)&&tempx){//一个小数只能拥有2或者5其中一个因数
                while(!(tempx%2)&&tempx){
                    tempx/=2;
                    two++;
                }
                book2[weishu][two]++;//使用数组存小数;
                Zhengshu tempzz;
                tempzz.ans5=0;
                tempzz.ans2=two;
                tempzz.len=weishu;
                zs.push(tempzz);
            }
            else if(!(tempx%5)&&tempx){
                    while(!(tempx%5)&&tempx){
                        tempx/=5;
                        five++;
                    }
                book5[weishu][five]++;
                Zhengshu tempzz;
                tempzz.ans5=five;
                tempzz.ans2=0;
                tempzz.len=weishu;
                zs.push(tempzz);
            }
            else{
                book[weishu]++;
            }
        }
        if(!flag){//为整数
            struct Zhengshu tempzs;
            zhengshu++;
            int temp3=tempz;
            while(!(tempz%5)&&tempz){//统计该整数的5因子
                tempz/=5;
                tempzs.ans5++;
            }
            while(!(temp3%2)&&temp3){//统计该整数的2因子
                temp3/=2;
                tempzs.ans2++;
            }
            zs.push(tempzs);//整数入队
        }
    }
    for(int i=1;i<50;i++){
        for(int j=1;j<50;j++){//前缀和处理
            sum2[i][j]=book2[i][j]+sum2[i-1][j]+sum2[i][j-1]-sum2[i-1][j-1];
            sum5[i][j]=book5[i][j]+sum5[i-1][j]+sum5[i][j-1]-sum5[i-1][j-1];
        }
    }
    for(int i=1;i<50;i++){
        sumyu[i]=book[i]+sumyu[i-1];
    }
    long long int xscountt=0;
    int ans=0;
    while(!zs.empty()){
        Zhengshu tempzs=zs.front();
        zs.pop();
        if(tempzs.ans2<tempzs.ans5){
            sum+=sum2[tempzs.ans2][49]+sum5[tempzs.ans2][49]+sumyu[tempzs.ans2];
            long long int tempsum=0;
            for(int i=1;i<=tempzs.ans5-tempzs.ans2;i++){
                if(tempzs.len){
                    if(tempzs.ans2+i-tempzs.len>0){
                        tempsum=sum2[tempzs.ans2+i-tempzs.len][49]-sum2[tempzs.ans2+i-tempzs.len-1][49]-sum2[tempzs.ans2+i-tempzs.len][i-1]+sum2[tempzs.ans2+i-tempzs.len-1][i-1];
                    }
                }
                else{
                    tempsum=sum2[tempzs.ans2+i][49]-sum2[tempzs.ans2+i-1][49]-sum2[tempzs.ans2+i][i-1]+sum2[tempzs.ans2+i-1][i-1];
                }
                if(tempsum){//如果是小数,那么tempsum不等于零只能存在另一个小数与之匹配25个数,那么另个小数必进入队列,且得分会再加一次
                    sum+=tempsum;
                    if(tempzs.len){
                        ans++;
                        xscountt+=tempsum;//统计队列中能相互加分的小数
                    }
                }
            }
        }
        else{
            sum+=sum5[tempzs.ans5][49]+sum2[tempzs.ans5][49]+sumyu[tempzs.ans5];
            long long int tempsum=0;
            for(int i=1;i<=tempzs.ans2-tempzs.ans5;i++){
                if(tempzs.len){
                    if(tempzs.ans5+i-tempzs.len>0){
                        tempsum=sum5[tempzs.ans5+i-tempzs.len][49]-sum5[tempzs.ans5+i-tempzs.len-1][49]-sum5[tempzs.ans5+i-tempzs.len][i-1]+sum5[tempzs.ans5+i-tempzs.len-1][i-1];
                    }
                }
                else{
                    tempsum=sum5[tempzs.ans5+i][49]-sum5[tempzs.ans5+i-1][49]-sum5[tempzs.ans5+i][i-1]+sum5[tempzs.ans5+i-1][i-1];
                }
                if(tempsum){
                    sum+=tempsum;
                    if(tempzs.len){
                        xscountt+=tempsum;
                        ans++;
                    }
                }   
            }
        }
    }
    cout<<sum+(zhengshu*(zhengshu-1))/2-xscountt/2;
    return 0;
}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值