2024牛客寒假算法基础集训营2(个人训练)

B Tokitsukaze and Cats

思路1

对没有只猫我们只需要枚举它的四个方向,看一下有没有猫,如果有他们就会公用一条边,需要注意的是这个方法会重复计算同一条共用的边,最后除2就行

代码1

#include <bits/stdc++.h>

typedef std::pair<int, int> pii;
#define INF 0x3f3f3f3f
#define MOD 998244353
using i64 = long long;
const int N = 1e5+5;

void solve(){
	int n, m, k, ans = 0, cnt = 0;
	std::cin >> n >> m >> k;

	std::queue<pii> q;

	std::vector t(n+2, std::vector<int>(m+2));
	for (int i = 0; i < k; i++){
		int a, b;
		std::cin >> a >> b;
		t[a][b] = 1;
		q.push(pii(a, b));
		ans += 4;
	}

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

	while (!q.empty()){
		auto [x, y] = q.front();
		q.pop();

		for (int i = 0; i < 4; i++){
			int dx = x + dir[i][0];
			int dy = y + dir[i][1];
			if (t[dx][dy] == 1){
				cnt++;
			}
		}
	}


	std::cout << (ans - cnt/2) << '\n';
}

signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);
	int t = 1, i;
	for (i = 0; i < t; i++){
		solve();
	}
	return 0;
}

思路2

看的别人的代码发现,其实可以用高中的知识,每一只猫都只看它的右上或左下,这样就避免了重复枚举的问题

代码2

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int i,j,k,n,m,t;
int f[666][666],res;

vector<pair<int,int> > d={{1,0},{-1,0},{0,1},{0,-1}};

int main(){
	ios::sync_with_stdio(0); cin.tie(0);
	cin>>n>>m>>t;
	res=t*4;
	while(t--){
		cin>>i>>j;
		f[i][j]=1;
	}
	for(i=1;i<=n;i++)for(j=1;j<=m;j++)if(f[i][j]){
		if(f[i+1][j])res--;
		if(f[i][j+1])res--;
	}
	cout<<res;
}

E Tokitsukaze and Eliminate (easy)

思路

贪心,签到题

代码

#include <bits/stdc++.h>

typedef std::pair<int, int> pii;
#define INF 0x3f3f3f3f
#define MOD 998244353
using i64 = long long;
const int N = 1e5+5;

void solve(){
	int n;
	std::cin >> n;	

	std::vector<int> v(n+1);
	for (int i = 1; i <= n; i++) std::cin >> v[i];
	int pos = n, ans = 0;
	for (int i = n; i >= 1; i--){
		if (v[i] != v[pos]){
			ans++;
			pos = i - 1;
		}
	}
	std::cout << ans + pos << '\n';
}

signed main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(nullptr);
	std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);
	int t = 1, i;
	std::cin >> t;
	for (i = 0; i < t; i++){
		solve();
	}
	return 0;
}
posted @ 2024-12-28 10:42  califeee  阅读(24)  评论(0)    收藏  举报