# APCS 2017/3 題解
## ==秘密差==
### 題目
[秘密差](https://zerojudge.tw/ShowProblem?problemid=c290)
### 核心
字元處理
### 思路
```c++=
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
cin>>str;
int A=0,B=0;
for(int i=1;i<=str.size();i++)
{
if(i&1) A+=(str[str.size()-i]-'0');
else B+=(str[str.size()-i]-'0');
}
printf("%d\n",abs(A-B));
}
```
## ==小群體==
### 題目
[小群體](https://zerojudge.tw/ShowProblem?problemid=c291)
### 核心
DFS
### 思路
```c++=
#include<bits/stdc++.h>
using namespace std;
#define N 50005
int friends[N];
bool visit[N]={false};
int ans=0;
int main()
{
int n,num;
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",friends+i);
for(int i=0;i<n;i++)
{
if(visit[i]) continue;
ans++;
num=i;
while(!visit[num])
{
visit[num]=true;
num=friends[num];
}
}
printf("%d\n",ans);
}
```
## ==數字龍捲風==
### 題目
[數字龍捲風](https://zerojudge.tw/ShowProblem?problemid=c292)
### 核心
找規律
### 思路
[參考解法](https://moon-jam.me/zerojudge_c292/)
```c++=
#include <bits/stdc++.h>
using namespace std;
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
int n,dir;
int arr[55][55];
vector<int> records;
cin>>n>>dir;
for(int i=0;i<n;i++) for(int j=0;j<n;j++) cin>>arr[j][i];
int dx[5]={-1,0,1,0}, dy[5]={0,-1,0,1};
int curx=n/2,cury=n/2,pace=10;
records.push_back(arr[curx][cury]);
while(curx>=0&&curx<n&&cury>=0&&cury<n)
{
for(int i=0, curp=pace/10; i<curp; i++)
{
curx+=dx[dir],cury+=dy[dir];
if(curx>=0&&curx<n&&cury>=0&&cury<n) records.push_back(arr[curx][cury]);
}
dir=(dir+1)%4, pace+=5;
}
for(int i : records) cout<<i;
cout<<'\n';
}
```
## ==基地台==
### 題目
[基地台](https://zerojudge.tw/ShowProblem?problemid=c575)
### 核心
二分搜、貪心
### 思路
找出最小滿足直徑。
```c++=
#include<bits/stdc++.h>
using namespace std;
#define N 50005
int n,k;
int locate[N];
bool judgeR(int r)
{
int to=-1,num=k;
for(int i=0;i<n;i++)
{
if(locate[i]>to) num--,to=locate[i]+r;
if(num<0) return false;
}
return true;
}
int findR()
{
int l=1,r=INT_MAX,mid;
while(l<r)
{
mid=l-(l-r)/2;
bool can=judgeR(mid);
if(can) r=mid;
else l=mid+1;
}
return r;
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++) scanf("%d",locate+i);
sort(locate,locate+n);
printf("%d\n",findR());
}
```