AcWing 第23场周赛
Posted 归游
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing 第23场周赛相关的知识,希望对你有一定的参考价值。
都知道完全平方数的性质
\\(n=sqrt(n)*sqrt(n) 且 sqrt(n)为整数\\)
验证一下\\(sqrt(n)\\)是不是整数即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
int a,ans=-1e6-10;
int main(){
cin>>n;
while(n--){
cin>>a;
int k=sqrt(a);
if(k*k!=a && a>ans) ans=a;
}cout<<ans<<endl;
}
传送阵
考的知识点:dfs
简化题意,分两种情况
- 连通,代价0
- 不连通,找能使两点连通的最小价值
针对第二种情况
用染色的思想,从起点和终点都搜一遍,能到的点分别存起来,然后枚举起点能到的点和终点能到的点,算出最小价值
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
const int maxn=60;
int mp[maxn][maxn];
bool book[maxn][maxn];
int r1,r2,c1,c2;
bool flag=0;//是否能直接到达
int ans=0;
struct node{
int x,y;
}st1[maxn*maxn],st2[maxn*maxn];//st1存起点能到的点,st2存终点能到达的点
int top1=0,top2=0;
int nt[4][2]={{1,0},{-1,0},{0,-1},{0,1}};
void dfs(int x,int y,int k,bool b){
mp[x][y]=k;
book[x][y]=1;
if(b==0){
st1[++top1].x=x;
st1[top1].y=y;
}
if(b==1){
st2[++top2].x=x;
st2[top2].y=y;
}
//能到达
if(x==r2 && y==c2 && b==0){
flag=1;return ;
}
if(x==r1 && y==c2 && b==1){
flag=1;return ;
}
for(int i=0;i<4;++i){
int nx=x+nt[i][0],ny=y+nt[i][1];
if(nx<1 || ny<1 || ny>n || nx>n) continue ;
if(book[nx][ny]==1) continue;
dfs(nx,ny,k+1,b);
}
}
int cal(int r1,int c1,int r2,int c2){//计算值
return (r1-r2)*(r1-r2)+(c1-c2)*(c1-c2);
}
int main(){
cin>>n;
cin>>r1>>c1>>r2>>c2;
memset(book,0,sizeof(book));
for(int i=1;i<=n;++i){
string s;
cin>>s;
for(int j=0;j<s.length();++j)
if(s[j]==\'1\') book[i][j+1]=1;
}
//深搜
dfs(r1,c1,0,0);
dfs(r2,c2,0,1);
if(flag==1){//能直接到达
cout<<"0"<<endl;
return 0;
}
//枚举找最小价值
int ans=1e9;
for(int i=1;i<=top1;++i)
for(int j=1;j<=top2;++j){
int a=st1[i].x,b=st1[i].y,m=st2[j].x,n=st2[j].y;
int val=cal(a,b,m,n);
if(val<ans) ans=val;
}
cout<<ans<<endl;
return 0;
}
最后一题鸽一鸽
Acwing第 31 场周赛完结
目录
4200. 简单问题【水题】
https://www.acwing.com/problem/content/4203/
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N];
int main(void)
for(int i=0;i<6;i++) cin>>a[i];
int cnt=0;
for(int i=0;i<1e5;i++)
if(i>=a[4]&&i<=a[5])
bool flag=true;
for(int j=0;j<4;j++) if(i>=a[j]) flag=false;
if(flag) cnt++;
cout<<cnt;
return 0;
4201. 01数【爆搜】
https://www.acwing.com/problem/content/4204/
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL n,cnt;
void dfs(LL sum)
if(sum>n) return;
cnt++;
dfs(sum*10+1);
dfs(sum*10+0);
int main(void)
cin>>n;
dfs(1);
cout<<cnt<<endl;
4202. 穿过圆【思维+bitset】
https://www.acwing.com/problem/content/description/4205/
遍历n个点,每个点对m个圆有在圆内和圆外两个状态,园内表示0,圆外表示1,把状态用二进制存储下来
如果a点,b点两个点,a在圆内b在圆外,或者a在圆外b在圆内,那么这个圆是一定需要穿过的
从a点到b点最少需要穿过的圆数等于,两个状态的异或后的1的数量
#include<bits/stdc++.h>
using namespace std;
#define x first
#define y second
const int N=1e3+10;
typedef long long int LL;
typedef pair<LL,LL> PII;
PII a[N],c[N];
LL n,m,k,r[N];
bitset<N>st[N];
bool check(int i,int j)
LL len=(a[i].x-c[j].x)*(a[i].x-c[j].x)+(a[i].y-c[j].y)*(a[i].y-c[j].y);
if(len>r[j]*r[j]) return 1;
else return 0;
int main(void)
cin>>n>>m>>k;
for(int i=0;i<n;i++) cin>>a[i].x>>a[i].y;
for(int i=0;i<m;i++) cin>>r[i]>>c[i].x>>c[i].y;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
st[i][j]=check(i,j);
while(k--)
int x,y; cin>>x>>y;
cout<<(st[x-1]^st[y-1]).count()<<endl;
return 0;
以上是关于AcWing 第23场周赛的主要内容,如果未能解决你的问题,请参考以下文章