Acwing第 44 场周赛【完结】

掉了100分,人麻了。还是菜啊

4317. 不同正整数的个数【签到】

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int n,x;
map<int,int>mp;
int main(void)
{
    
    
    cin>>n;
    for(int i=0;i<n;i++) 
    {
    
    
        cin>>x;
        if(x>0) mp[x]++;
    }
    cout<<mp.size();
	return 0;
}

4318. 最短路径【思维】

在这里插入图片描述
很容易想到不能有环。
在这里插入图片描述
再者就是上述情况,你会发现如果有几个块在一块的话是不行的。
故在移动的同时对于一个点,最多有一个相邻的点。

#include<bits/stdc++.h>
using namespace std;
const int N=210;
int a[N][N],x,y;
int dx[4]={
    
    -1,0,0,1};
int dy[4]={
    
    0,-1,1,0};
string s;
bool flag=1;
int main(void)
{
    
    
    cin>>s;
    x=200,y=200,a[x][y]=1;
    for(int i=0;i<s.size();i++)
    {
    
    
        if(s[i]=='U') x--;
        if(s[i]=='D') x++;
        if(s[i]=='L') y--;
        if(s[i]=='R') y++;
        int cnt=0;
        for(int j=0;j<4;j++)
        {
    
    
            int tempx=x+dx[j];
            int tempy=y+dy[j];
            cnt+=a[tempx][tempy];
        }
        if(cnt>1) flag=0;
        if(a[x][y]) flag=0;
        a[x][y]=1;
    }
    if(flag) puts("YES");
    else puts("NO");
    return 0;
}

比较好想的就是跑一遍,将对应的点标记,其余的都是初始的0(即为障碍物)。
bfs一遍看最小步数,是不是我们操作的步数即可。

#include<bits/stdc++.h>
using namespace std;
const int N=210;
typedef pair<int,int> PII;
int a[N][N],stx,sty,edx,edy;
int dx[4]={
    
    -1,0,0,1};
int dy[4]={
    
    0,-1,1,0};
int dist[N][N];
string s;
bool flag=1;
void bfs(int x,int y)
{
    
    
    int st[N][N]={
    
    0};
    queue<PII>q; q.push({
    
    x,y}); st[x][y]=1;
    dist[x][y]=0;
    while(q.size())
    {
    
    
        auto temp=q.front(); q.pop();
        x=temp.first,y=temp.second;
        if(x==edx&&y==edy)
        {
    
    
            if(dist[edx][edy]!=s.size()) flag=0;
            return;
        }
        for(int i=0;i<4;i++)
        {
    
    
            int tempx=x+dx[i];
            int tempy=y+dy[i];
            if(st[tempx][tempy]) continue;
            if(!a[tempx][tempy]) continue;
            st[tempx][tempy]=1;
            dist[tempx][tempy]=dist[x][y]+1;
            q.push({
    
    tempx,tempy});
        }
    }
}
int main(void)
{
    
    
    cin>>s;
    stx=200,sty=200,edx=200,edy=200;
    a[edx][edy]++;
    for(int i=0;i<s.size();i++)
    {
    
    
        if(s[i]=='U') edx--;
        if(s[i]=='D') edx++;
        if(s[i]=='L') edy--;
        if(s[i]=='R') edy++;
        a[edx][edy]++;
    }
    bfs(stx,sty);
    if(flag) puts("YES");
    else puts("NO");
    return 0;
}

4319. 合适数对【数论】

在这里插入图片描述
对于每个数,分解质因子,求其个数。找到可以互补的为k的计算结果。
统计个数。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
LL n,m,ans,a[N],cnt[N];
LL solve(LL a,LL b)
{
    
    
    LL res=1;
    while(b--)
    {
    
    
        res=res*a;
        if(res>=N) res=0;
    }
    return res;
}
int main(void)
{
    
    
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
    
    
        LL x=1,y=1;
        for(int j=2;j*j<=a[i];j++)
        {
    
    
            int s=0;
            while(a[i]%j==0) a[i]/=j,s++;
            s=s%m;
            if(s) 
            {
    
    
                x*=solve(j,s);
                y*=solve(j,m-s);//算其互补的
            }
        }
        if(a[i]!=1) 
        {
    
    
            x*=solve(a[i],1);
            y*=solve(a[i],m-1);
        }
        if(y>=N) y=0;
        ans+=cnt[y];
        cnt[x]++;
    }
    cout<<ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_46527915/article/details/123773710