牛客周赛 Round 92【题解完成】

22 阅读3分钟
题目难度知识点
A 小红的签到题签到
B 小红的模拟题思维
C 小红的方神题思维
D 小红的数学题★★思维
E 小红的ds题构造
F 小红的小苯题★★构造

F题不会,其他的D有点意思。

小红的签到题

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5+10;
typedef long long int LL;
LL a[N],n;
int main(void)
{
    cin>>n;
    cout<<"z_";
    for(int i=1;i<=n-2;i++) cout<<"z";
    return 0;
}

小红的模拟题

#include<bits/stdc++.h>
using namespace std;
const int N=1e3*3+10;
typedef long long int LL;
string s[N],ans;
int n,m,st[N][N];
int dx[4]={0,1};
int dy[4]={1,0};
string ss="DS";
void dfs(int x,int y,string temp)
{
    st[x][y]=1;
    if(ans.size()) return;
    if(x==(n-1) && y==(m-1))
    {
        ans=temp;
        return;
    }
    for(int i=0;i<2;i++) 
    {
        int tempx=x+dx[i],tempy=y+dy[i];
        if(tempx<0||tempx>=n||tempy<0||tempy>=m) continue;
        if(st[tempx][tempy]) continue;
        if(s[tempx][tempy]=='#') continue;
        dfs(tempx,tempy,temp+ss[i]);
    }
}
int main(void)
{
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>s[i];
    dfs(0,0,"");
    cout<<ans;
    return 0;
}

不一定要dfs,其实有两种情况,必有一种情况满足。

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
string s[N],ans1,ans2;
int n,m,flag;
int main(void)
{
    cin>>n>>m;
    for(int i=0;i<n;i++) cin>>s[i];
    for(int i=1;i<=m-1;i++) ans1+="D";
    for(int i=1;i<=n-1;i++) ans1+="S";
    for(int i=1;i<=n-1;i++) ans2+="S";
    for(int i=1;i<=m-1;i++) ans2+="D";
    int x=0,y=0;
    for(int i=0;i<(int)ans1.size();i++)
    {
        if(ans1[i]=='D') y++;
        else x++;
        if(s[x][y]=='#') flag=1;
    }
    if(flag) cout<<ans2;
    else cout<<ans1;
    return 0;
}

小红的方神题

构造规律挺好找的。

#include<bits/stdc++.h>
using namespace std;
const int N=1e3*3+10;
typedef long long int LL;
int n;
int main(void)
{
    cin>>n;
    if(n==1 || n==2) puts("-1");
    else
    {
        cout<<"1 ";
        for(int i=n,j=1;j<=n-1;j++,i--) cout<<" "<<i;
    }
    return 0;
}

小红的数学题

image.png 暴力枚举可以看到,有俩根那么意味着

(x-a)(x-b)=x^2-(a+b)x+ab=0
p=a+b,q=ab;
a+b+ab=k,枚举b计算a,求出pq即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL k;
int main(void)
{
    cin>>k;
    for(LL i=1;i<=1e6;i++)
    {
        LL b=i;
        if( (k-i)%(i+1)==0)
        {
            LL a=(k-i)/(i+1);
            if(a+b>0 && a*b>0)
            {
                cout<<a+b<<" "<<a*b;
                return 0;
            }
        }
    }
    puts("-1");
    return 0;
}

小红的ds题

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,a[N],sum;
map<int,int>l,r;
int main(void)
{
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
    int u=1;//u是上次层的起始点,
    for(int i=2;i<=n;i++)
    {
        int temp=u+a[i-1],cnt=a[i];//temp是这一层的起始点
        for(int j=1,p=u;j<=a[i];j++,p++)
        {
            if(cnt) l[p]=temp++,cnt--;
            else l[p]=-1;
            if(cnt) r[p]=temp++,cnt--;
            else r[p]=-1;
            if(cnt==0) break;
        }
        u=temp-a[i];
    }
    cout<<1<<endl;
    for(int i=1;i<=sum;i++){
        if(l[i]) cout<<l[i]<<" ";
        else cout<<-1<<" ";
        if(r[i]) cout<<r[i]<<endl;
        else cout<<-1<<endl;
    }
    return 0;
}

小红的小苯题

image.png

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int a[N][N],flag;
int main(void)
{
    int n,m; cin>>n>>m;
    if(n>m) swap(n,m),flag=1;
    for(int i=1;i<=n;i++) a[i][i]=i;
    for(int i=n+1;i<m;i++) a[n][i]=i;
    for(int i=1,j=m+1;i<=n-1;i++,j++) a[i][m]=i^j;
    int s=m;
    for(int i=1;i<=n-1;i++) s^=a[i][m];
    a[n][m]=s;
    int temp=0;
    for(int i=1;i<=m;i++) temp^=a[n][i];
    if( temp== (n+m) )
    {
        if(!flag){
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=m;j++) cout<<a[i][j]<<" ";
                puts("");
            }
        }else{
            for(int i=1;i<=m;i++)
            {
                for(int j=1;j<=n;j++) cout<<a[j][i]<<" ";
                cout<<endl;
            }
        }
    }else puts("-1");
    return 0;
}
/*
1    1^5
 2   1^6
   3  x  7
   
      4
*/