round 648

B

如果同时存在0 1 两种数据,那么每个数可以去到随意一个位置。

如果只存在0 1 其中一种数据,那么位置之间不能交换,只能判断数组本身是否递增。

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
#define ri register int
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 505;
const int INF = 0x3f3f3f3f; 
const int mod = 998244353;
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
struct node
{
    int x,y;    
};
int t,n,i,flag;
node a[maxn];
int main()
{
    t=read();
    while (t--)
    {
        n=read();
        for (i=1;i<=n;i++) a[i].x=read();
        for (i=1;i<=n;i++) a[i].y=read();
        set<int> s;
        for (i=1;i<=n;i++) s.insert(a[i].y);
        if (s.size()==2) cout<<"Yes"<<endl;
        else
        {
            flag=1;
            for (i=1;i<n;i++) 
                if (a[i].x>a[i+1].x) 
                {
                    flag=false;
                    break;
                }
            if (flag) cout<<"Yes"<<endl;
                else cout<<"No"<<endl;
        }
    }
    return 0;
}
View Code

C

枚举每个数,假设这个数最后是匹配的,那么算出它要移动的距离是多少,其中,用一个桶数组统计有多少个数是移动了相同距离的。

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
#define ri register int
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 2e5+10;
const int INF = 0x3f3f3f3f; 
const int mod = 998244353;
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int n,i,x,a[maxn],ans[maxn],maxx;
int main()
{
    n=read();
    for (i=1;i<=n;i++) 
    {
        x=read();
        a[x]=i;
    }
    for (i=1;i<=n;i++)
    {
        x=read();
        if (i<=a[x]) ans[a[x]-i]++;
            else if (i>a[x]) ans[n-i+a[x]]++;
    }
    for (i=0;i<n;i++) maxx=max(maxx,ans[i]);
    cout<<maxx<<endl;
    return 0;
    
}
View Code

D

①把坏人上下左右围起来,如果好人就在坏人身边,那么好人怎么走,坏人能跟着好人。

②统计好人个数,如果出口被封,那么图里面没有好人的话也是可以输出Yes的

③从出口处开始搜索,找到所有能找到的好人为止,最后判断好人有没有找全。

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
#define ri register int
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 105;
const int INF = 0x3f3f3f3f; 
const int mod = 998244353;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int n,m;
char s[maxn][maxn];
void solve()
{
    int num=0;
    queue<pii>q;
    for (ri i=1;i<=n;i++)
        for (ri j=1;j<=m;j++)
            if (s[i][j]=='B')
            {
                for (ri k=0;k<4;k++)
                {
                    int xx=dx[k]+i;
                    int yy=dy[k]+j;
                    if (xx>=1 && xx<=n && yy>=1 && yy<=m)
                    {
                        if (s[xx][yy]=='.') s[xx][yy]='#';
                        else if (s[xx][yy]=='G') 
                        {
                            cout<<"No"<<endl;
                            return;        
                        }
                    }
                }
            }
            else if (s[i][j]=='G') num++;
    if (s[n][m]=='#') 
    {
        if (num==0) cout<<"Yes"<<endl;
            else cout<<"No"<<endl;
        return;
    }
    q.push(mp(n,m));
    s[n][m]='#';
    while (!q.empty())
    {
        pii now=q.front();
        q.pop();
        for (ri i=0;i<4;i++)
        {
            int xx=dx[i]+now.first;
            int yy=dy[i]+now.second;
            if (xx>=1 && xx<=n && yy>=1 && yy<=m)
                if (s[xx][yy]!='#')
                {
                    if (s[xx][yy]=='G')num--; 
                    q.push(mp(xx,yy));
                    s[xx][yy]='#';
                }
        }
    }
    if (num==0) cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
}
int main()
{
    int t;
    t=read();
    while (t--)
    {
        n=read(),m=read();
        for (int i=1;i<=n;i++)
            scanf("%s",s[i]+1);
        solve();
    }
    return 0;
}
View Code

E

对于n<=3,那么怎么选都是选n个;

对于n>3,那么怎么选都是选3个;因为选4个的话,如果想对结果不产生不利影响,则需要原有3个在这个位置上为1,且第四个也在这个位置有1。这样的话,加进来的这个数,不会产生价值,只存在原值不变和原值减小。

#include <bits/stdc++.h>
#define debug freopen("r.txt","r",stdin)
#define mp make_pair
#define ri register int
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 505;
const int INF = 0x3f3f3f3f; 
const int mod = 998244353;
inline ll read(){ll s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;}
ll qpow(ll p,ll q){return (q&1?p:1)*(q?qpow(p*p%mod,q/2):1)%mod;}
int n,i,j,k;
ll ans,a[maxn];
int main()
{
    n=read();
    for (i=1;i<=n;i++) a[i]=read();
    for (i=1;i<=n;i++)
        for (j=1;j<=n;j++)
            for (k=1;k<=n;k++)
                ans=max(ans,a[i]|a[j]|a[k]);
    cout<<ans<<endl;
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/Y-Knightqin/p/13368005.html