zzuli 20级新生周赛(1)题解

前言:涉及了字符串的题运用了string类,比char要方便很多,建议学习。

A.藏头诗

题解:
按题意输出。

B.画剑

题解:
循环即可。

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;



signed main(){
    int n;
    cin>>n;
    cout<<">>>";
    for(int i=0;i<n;i++) cout<<"-";
    cout<<">"<<endl;
    return Accepted;
}

C.商品总数

题解:
A=B-1=C-2

最后的结果取决于这三者的最小值。
这里是 以A为基准进行计算。(也可以取B或C为基准进行计算)
最后的值是ABC的平均值*3
B=A+1
所以答案如下。

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;



signed main(){
    int x,y,z;
    cin>>x>>y>>z;
    int t=min(x,min(y-1,z-2));
    cout<<(t+1)*3<<endl;
    return Accepted;
}

D. 小“光棍节”

题解:
首先增长速率按照2的速率增长(当然不是严格的2,因为有许多顺序行不通)
所以这个时候就不要考虑爆搜了大约 2 50 2^{50} 250(到不了),复杂度爆炸了。
那么考虑递推。
递推公式

dp[i][1][1]=dp[i-1][1][0];
dp[i][1][0]=dp[i-1][0][1]+dp[i-1][0][0];
dp[i][0][1]=dp[i-1][1][1]+dp[i-1][1][0];
dp[i][0][0]=dp[i-1][0][0]+dp[i-1][0][1];

dp[i][x][y] (x,y)为1或0
表示长度为i,切第i位为x,第i-1位为y 的个数

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
int dp[55][2][2];
signed main(){
	int t;
	cin>>t;
	while(t--){
        int n;
        cin>>n;
        dp[1][1][0]=1,dp[1][0][0]=1;
        for(int i=2;i<=n;i++){
            dp[i][1][1]=dp[i-1][1][0];
            dp[i][1][0]=dp[i-1][0][1]+dp[i-1][0][0];
            dp[i][0][1]=dp[i-1][1][1]+dp[i-1][1][0];
            dp[i][0][0]=dp[i-1][0][0]+dp[i-1][0][1];
        }
        cout<<dp[n][1][0]+dp[n][1][1]+dp[n][0][0]+dp[n][0][1]<<endl;
	}
	return 0;
}

E.神秘的123

题解:
tips
利用c++的string类数字转字符串函数可以轻松解决此类问题。
题目既然没说会出现死循环问题,那么就一定会出现123,所以尽管while true即可。

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;



signed main(){
    string s;
    cin>>s;
    int odd=0,even=0;
    while(true){
        for(int i=0;i<s.size();i++){
            if((s[i]-'0')&1)  even++;
            else odd++;
        }
        s=to_string(odd)+to_string(even)+to_string(odd+even);
        cout<<s<<endl;
        if(s=="123") break;
        even=odd=0;
    }
    return Accepted;
}

F.黄河大鲤鱼

题解:
寻找左括号和右阔号的个数
代码:

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;


signed main(){
    string s;
    cin>>s;
    int ans=0;
    for(auto i:s){
        if(i=='('||i==')') ans++;
    }
    if(ans>=6) cout<<"big"<<endl;
    else cout<<"small"<<endl;
    return Accepted;
}

G.黑洞13

题解:
模拟题,熟练掌握字符串后对于此题处理会方便。
数字与字符串之间互相转换。
代码:

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;


signed main(){
    string s;
    cin>>s;
    while(s!="13"){
        int ans=0;
        for(auto i:s) ans+=i-'0';
        s=to_string(ans*3+1);
        cout<<s<<endl;
    }
    return Accepted;
}

H.字母金字塔

题解:
因为题目是蛇形走位环下来的,所以奇数层 反转字符串后输出。
字母循环取用,所以直接取模即可。
代码:

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;


signed main(){
    int n;
    cin>>n;
    int cnt=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n-i-1;j++) cout<<" ";
        string s="";
        for(int j=0;j<i*2+1;j++){
            s+=(cnt%26+'A');
            cnt++;
        }
        if((i+1)&1) cout<<s<<endl;
        else{
            reverse(s.begin(),s.end());
            cout<<s<<endl;
        }
    }
}

I.回文陷阱

题解:
利用string转数字和数字转string的函数轻松AC此题。
按照题意来回变化即可。

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;

bool che(string s){
    int len=s.size();
    for(int i=0;i<len/2;i++){
        if(s[i]!=s[len-i-1]) return false;
    }
    return true;
}
signed main(){
    string s;
    cin>>s;
    int cnt=0;
    if(che(s)){
        cout<<"HW"<<endl;
        return 0;
    } 
    while(cnt<=10){
        if(che(s)){
            cout<<cnt<<" "<<s<<endl;
            return 0;
        }
        cnt++;
        int x=stoll(s);
        reverse(s.begin(),s.end());
        x+=stoll(s);
        s=to_string(x);
    }
    cout<<"NONE"<<endl;
    return 0;

}

J.数字方框

题解:
先输出一行1-n
在循环输出下面2~(n-1)行
在输出最后一行即可。
这三段分开来写。

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

//#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;


signed main(){
    int n;
    cin>>n;
    if(n==1){
        printf("  1");
        return 0;
    }
    for(int i=1;i<=n;i++) printf("%3d",i);
    printf("\n");
    for(int i=2;i<=n-1;i++){
        printf("%3d",i);
        for(int j=0;j<n-2;j++) printf("   ");
        printf("%3d\n",n-i+1);
    }
    for(int i=n;i>=1;i--){
        printf("%3d",i);
    }
    return 0;

}

K.图像运算

题解:
好家伙,好似是个模拟题。
不过一看数据范围不大,那就不想了,直接把数组开的大一点暴力即可。
我们把数组开的大一点后,把元素放到中间去。
在这里插入图片描述
每次循环一个比较大的范围,计算上面的数与下面的数相乘的结果即可(当然你你可以每次移动下面数组的元素,这样也不会超时,但是用数组下标搓一下位置即可,无需移动。
下图为:模拟让下面数组错位也就是这一块的内容
在这里插入图片描述

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

//#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;

int n,m;
int a[maxn],b[maxn];
signed main(){
    cin>>n;
    for(int i=2000;i<2000+n;i++) cin>>a[i];
    cin>>m;
    for(int i=2000-1;i>=2000-m;i--) cin>>b[i];
    for(int i=1;i<=m+n-1;i++){
        int ans=0;
        for(int j=1500;j<3500;j++){
            ans+=a[j]*b[j-i];
        }
        cout<<ans<<" ";
    }
    return 0;
}

L.D

题解:(本题没验证对不对,因为交不了)
因为范围不大,所以可以开二维数组来储存
第一维是用户
二维是权益
a[x][y]代表用户x是否拥有y个权益
a[x][y]代表角色x是否拥有y个权益

/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>

//#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =1e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;

bool a[110][110];//用户
bool b[110][110];//角色

signed main(){
    int n,m;
    while(cin>>n>>m){
        memset(a,false,sizeof a);
        memset(b,false,sizeof b);
        for(int i=0;i<m;i++){
            int opt,x,y;
            cin>>opt>>x>>y;
            if(opt==1) a[y][x]=true;
            if(opt==2) b[y][x]=true;
            if(opt==3){
                for(int j=0;j<30;j++){
                    if(b[x][j]) a[y][j]=true;
                }
            }
            if(opt==4){
                if(a[x][y]) cout<<"yes"<<endl;
                else cout<<"no"<<endl;
            }
        }
    }
    return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值