【Atcoder训练记录】AtCoder Beginner Contest 378

训练情况

赛后反思

简单题又WA了一发,淦,开局崩心态,然后做题的时候被场外因素打断了。

A题

统计 \([1,4]\) 中每个数字出现的个数,输出对数即可。

#include <bits/stdc++.h>
#define int long long

using namespace std;

int cnt[5];

void solve(){
	for(int i = 1;i<=4;i++){
		int x; cin>>x;
		cnt[x]++;
	}
	cout<<cnt[1]/2+cnt[2]/2+cnt[3]/2+cnt[4]/2<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

B题

找大于 \(d\)\(x\),使得 \(x \mod q_t=r_t\),我们分类讨论 \(d \mod q_t \le r_t\) 时,答案就是 \(d\) 加上多出来模数的那一部分,\(d \mod q_t \le r_t\) 时,就需要跳到倍数的下一段。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n; cin>>n;
	vector<int> r(n + 1),q(n + 1);
	for(int i = 1;i<=n;i++) cin>>q[i]>>r[i];
	int qq; cin>>qq;
	while(qq--){
		int t,d; cin>>t>>d;
		int res = d%q[t];
		if(d%q[t] <= r[t]) cout<<d+(r[t]-res)<<endl;
		else cout<<d+(q[t]-res)+(r[t]%q[t])<<endl;
	}	
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

C题

什么时候 ABC 的 C 题白送了,我们维护一个 \(last_i\) 表示最后一次数字 \(i\) 出现的位置,直接 \(O(n)\) 即可,没更新过的就是 \(-1\),更新过的直接输出。

#include <bits/stdc++.h>
#define int long long

using namespace std;

void solve(){
	int n; cin>>n;
	vector<int> a(n + 1);
	for(int i = 1;i<=n;i++) cin>>a[i];
	map<int,int> last;
	for(int i = 1;i<=n;i++){
		if(!last[a[i]]) cout<<-1<<" ",last[a[i]] = i;
		else cout<<last[a[i]]<<" ",last[a[i]] = i;
	}	
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}

D题

从某一点出发,刚好走 \(m\) 次,我们直接 \(O(nm)\) 找空闲位置,直接大力深度优先搜索(DFS),维护一个当前位置和步数,开一个 vis 记录某点是否走过,去掉重复走过的路径,然后回溯,满足 \(=k\) 答案就加。

#include <bits/stdc++.h>
#define int long long

using namespace std;

const int N = 17;

int n,m,k; 
vector<string> s(N);
bool vis[N][N];

struct node{
	int x,y;
};

int u[4][2] = {{0,1},{1,0},{-1,0},{0,-1}};

int cnt = 0;
int ans = 0;

void dfs(int x,int y,int step){
	if(step==k){
		ans++;
		return;
	}
	for(int i = 0;i<4;i++){
		int xx = x + u[i][0];
		int yy = y + u[i][1];
		if(xx < 0 || yy < 0 || xx > n-1 || yy > m-1 || s[xx][yy] == '#' || vis[xx][yy]) continue;
		vis[xx][yy] = 1;
		dfs(xx,yy,step+1);
		vis[xx][yy] = 0;
	}
}

void solve(){
	cin>>n>>m>>k;
	for(int i = 0;i<n;i++) cin>>s[i];
	for(int i = 0;i<n;i++){
		for(int j = 0;j<m;j++){
			if(s[i][j] == '.'){
				vis[i][j] = 1;
				dfs(i,j,0);
				vis[i][j] = 0;
			}
		}
	}
	cout<<ans<<endl;
}

signed main(){
	// int T; cin>>T; while(T--)
	solve();
	return 0;
}
posted @ 2024-11-02 22:10  MNNUACM_2024ZY  阅读(32)  评论(0编辑  收藏  举报