掉了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;
}