省流:dfs 都会写错。
正片:
A:Pairing
统计一下每个数字出现了多少次即可,每次减去 2。
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,ans;
map<int,int> mp;
int main(){
cin>>a>>b>>c>>d;
mp[a]++,mp[b]++,mp[c]++,mp[d]++;
while(mp[a]>=2) mp[a]-=2,ans++;
while(mp[b]>=2) mp[b]-=2,ans++;
while(mp[c]>=2) mp[c]-=2,ans++;
while(mp[d]>=2) mp[d]-=2,ans++;
cout<<ans;
return 0;
}
B:Garbage Collection
求出余数,然后判断一下大小关系即可。
#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define getmax(a,b) a=max(a,b)
#define getmin(a,b) a=min(a,b)
using namespace std;
int n,qe;
int q[2000],r[2000],t,d;
signed main(){
ios::sync_with_stdio(false);
*cin.tie(nullptr)<<fixed<<setprecision(20);
cin>>n;
rep(i,1,n) cin>>q[i]>>r[i];
cin>>qe;
rep(i,1,qe){
cin>>t>>d;
int k=d%q[t];
if(k<=r[t]) cout<<d+r[t]-k<<'\n';
else cout<<q[t]-k+d+r[t]<<'\n';
}
return 0;
}
C:Repeating
开一个 map 记录当前数上一次出现的地方,如果没有就 \(b_i=-1\),否则 \(b_i=mp_{a_i}\)。每次 \(mp_{a_i}\) 都更新成 \(i\) 即可。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define getmax(a,b) a=max(a,b)
#define getmin(a,b) a=min(a,b)
using namespace std;
const int N=200010;
int n,a[N],b[N];
unordered_map<int,int> mp;
int main(){
ios::sync_with_stdio(false);
*cin.tie(nullptr)<<fixed<<setprecision(20);
cin>>n;
rep(i,1,n) cin>>a[i];
rep(i,1,n){
if(mp[a[i]]) b[i]=mp[a[i]],mp[a[i]]=i;
else b[i]=-1,mp[a[i]]=i;
}
rep(i,1,n) cout<<b[i]<<' ';
return 0;
}
D:Count Simple Paths
注意到 \(n,m,k\) 的范围都非常小,考虑直接暴力。
题目中所说的不同路径其实完全没有用,每次找到一个合法的位置,暴力 dfs 找有没有点和它距离为 \(k\) ,由于起点都不一样,那么这个限制就没有任何作用了。
感觉用 bfs 做的话,队列中的每个元素 \(u\) 都还要增加一个 \(set\) 或者 \(map\) 记录当前走过的点。
#include<bits/stdc++.h>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define pre(i,a,b) for(int i=a;i>=b;i--)
#define getmax(a,b) a=max(a,b)
#define getmin(a,b) a=min(a,b)
using namespace std;
const int N=101;
int n,m,k;
char a[N][N];
ll ans;
bool vis[N][N];
const int dx[]={0,0,1,-1},dy[]={1,-1,0,0};
void dfs(int x,int y,int step){
if(step==k){
ans++;
return ;
}
for(int i=0;i<4;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx>=1&&ny>=1&&nx<=n&&ny<=m&&!vis[nx][ny]&&a[nx][ny]=='.'){
vis[nx][ny]=true;
dfs(nx,ny,step+1);
vis[nx][ny]=false;
}
}
}
int main(){
ios::sync_with_stdio(false);
*cin.tie(nullptr)<<fixed<<setprecision(20);
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(a[i][j]=='.'){
memset(vis,0,sizeof vis);
vis[i][j]=true;
dfs(i,j,0);
}
}
}
cout<<ans<<'\n';
return 0;
}
标签:AtCoder,int,题解,rep,++,cin,378,mp,define
From: https://www.cnblogs.com/Merge-Change230/p/18522575