AtCoder Beginner Contest 350

A - Past ABCs

简单的枚举判断即可

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>
#define si set<int> 
#define mi map<int,int>
#define mc map<char,int>
#define YES cout<<"Yes"<<endl;
#define NO  cout<<"No"<<endl;
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
void solve()
{
	string s;
	cin>>s;
	int sum=0;
	for (int i=3;i<6;i++){
		sum=sum*10+(s[i]-'0');
	}
	string s1=s.substr(0,3);
	if(s1=="ABC" && sum>=1 && sum<=349 && sum!=316){
		YES
	}
	else {
		NO
	}
	
}
signed main()
{
	IOS
	int t;
	t=1;//cin>>t;
	while(t--){
		solve();
	}
}

B - Dentist Aoki

如果一个洞奇数次进,则总数加一偶数次进总数减一。

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>
#define si set<int> 
#define mi map<int,int>
#define mc map<char,int>
#define YES cout<<"Yes"<<endl;
#define NO  cout<<"No"<<endl;
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
void solve()
{
	int n,q;
	cin>>n>>q;
	int sum=n;
	vector<int> a(n+1,1);

	for (int i=1;i<=q;i++){
		int x;
		cin>>x;
		if(a[x]==1){
			a[x]=0;
			sum--;
		}
		else {
			a[x]=1;
			sum++;
		}
	}
	cout<<sum;
}
signed main()
{
	IOS
	int t;
	t=1;//cin>>t;
	while(t--){
		solve();
	}
}

C - Sort 

先用一个数组记录第几个输入的数字,然后一个数组记录这个数字的位置,

然后再按照排列从小到大的顺序遍历,如果这个数不在相对应的位置上就和其需要到的位置上的数交换 。时间复杂度(n).

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>
#define si set<int> 
#define mi map<int,int>
#define mc map<char,int>
#define YES cout<<"Yes"<<endl;
#define NO  cout<<"No"<<endl;
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
void solve()
{
	int n;
	cin>>n;
	vi a(n+1);
	vi b(n+1);
	
	for (int i=1;i<=n;i++){
		cin>>a[i];
		b[a[i]]=i;
	}
	int cnt=0;
	vector<pi> v;

	for (int i=1;i<=n;i++){
		if(b[i]!=i){
			int j=b[i];
			swap(a[i],a[j]);
			swap(b[a[i]],b[a[j]]);
			v.push_back({i,j});
		}
	}
	
	cout<<(int)v.size()<<endl;
	for (int i=0;i<(int)v.size();i++){
		auto [x,y]=v[i];
		cout<<x<<" "<<y<<endl;
	}
	
}
signed main()
{
	IOS
	int t;
	t=1;//cin>>t;
	while(t--){
		solve();
	}
}

D - New Friends

这题考察联通块的知识,每个联通块内都可以有(cnt)*(cnt-1)/2条边。

这题可以用两种做法:

1.图论

因为存在一个点被联通块内多个点连接的情况,所以每次先加上边,最后除以2.

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>
#define si set<int> 
#define mi map<int,int>
#define mc map<char,int>
#define YES cout<<"Yes"<<endl;
#define NO  cout<<"No"<<endl;
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
int vis[200010];
void solve()
{
	int n,m;
	cin>>n>>m;
	vector<vector<int>> v(n+1);
	for (int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		v[x].push_back(y);
		v[y].push_back(x);
	}
	int ans=0;
	
	for (int i=1;i<=n;i++){
		if(vis[i]){
			continue;
		}
		queue<int> q;
		q.push(i);
		vis[i]=1;
		int cnt1=1,cnt2=0;
		while(q.size()){
			int u=q.front();
			q.pop();
			for (auto x : v[u]){
				cnt2++;
				if(vis[x]==0){
					vis[x]=1;
					cnt1++;
					q.push(x);
					
				}
				
			}
		}
		
		ans+=cnt1*(cnt1-1)-cnt2;
		
	}
	ans/=2;
	cout<<ans;
}
signed main()
{
	IOS
	int t;
	t=1;//cin>>t;
	while(t--){
		solve();
	}
}

2.并查集

#include "bits/stdc++.h"
using namespace std;

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>
#define si set<int> 
#define mi map<int,int>
#define mc map<char,int>
#define YES cout<<"Yes"<<endl;
#define NO  cout<<"No"<<endl;
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }
int p[200010],cnt[200010];
int find(int x)
{
	if(p[x]!=x) p[x]=find(p[x]);
    return p[x];
}
void solve()
{
	int n,m;
	cin>>n>>m;
	iota(p+1,p+n+1,1);
	for (int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		p[find(x)]=find(y);
	}
	
	int ans=-m;
	for (int i=1;i<=n;i++){
		cnt[find(i)]++;
	}
	
	for (int i=1;i<=n;i++){
		ans+=cnt[i]*(cnt[i]-1)/2;
	}
	
	cout<<ans;


}
signed main()
{
	IOS
	int t;
	t=1;//cin>>t;
	while(t--){
		solve();
	}
}

E - Toward 0

mp[n]是n的期望花费。

cost1=mp[n/a]+x。  

cost2=\sum1~6 mp[n/i] / 6 + y  当i=1时 两边有相同的式子,把它移到左边。

cost2=\sum_{2}^{6}i mp[n/i]/5+\frac{6}{5}*y 

#define int long long 
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int> 
#define vi vector<int>
#define si set<int> 
#define mi map<int,int>
#define mc map<char,int>
#define YES cout<<"Yes"<<endl;
#define NO  cout<<"No"<<endl;
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return true; } return false; }
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return true; } return false; }

void solve()
{
	int n,a,x,y;
	cin>>n>>a>>x>>y;
	map<int,double> mp;
	
	auto dfs=[&](auto dfs,int u)-> double{
		if(u==0){
			return 0;
		}
		if(mp.find(u)!=mp.end()){
			return mp[u];
		}
		
		double cost1=dfs(dfs,u/a)+x;
		double cost2=0;
		for (int i=2;i<=6;i++){
			cost2+=dfs(dfs,u/i);
		}
		cost2=cost2/5+1.0*y*6/5;
	
		return mp[u]=min(cost1,cost2);
	};
	dfs(dfs,n);
	cout<<fixed<<setprecision(10)<<mp[n];	
	
}
signed main()
{
	IOS
	int t;
	t=1;//cin>>t;
	while(t--){
		solve();
	}
}

相关推荐

  1. leetcode350-Intersection of Two Arrays II

    2024-04-22 07:34:01       14 阅读
  2. ABC340(A-C)

    2024-04-22 07:34:01       27 阅读
  3. 题目 3150: 冶炼金属

    2024-04-22 07:34:01       21 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-22 07:34:01       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-22 07:34:01       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-22 07:34:01       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-22 07:34:01       18 阅读

热门阅读

  1. Golang函数重试机制实现

    2024-04-22 07:34:01       13 阅读
  2. Deepin中安装Golang1.22

    2024-04-22 07:34:01       11 阅读
  3. 使用idea如何打开python项目

    2024-04-22 07:34:01       14 阅读
  4. 【LeetCode热题100】【子串】最小覆盖子串

    2024-04-22 07:34:01       11 阅读
  5. FFMPEG C++封装(三)

    2024-04-22 07:34:01       13 阅读
  6. Delete the specified node in the linked list with dummy header

    2024-04-22 07:34:01       11 阅读
  7. mac tcp实现客户端与服务端进行图像传输及处理

    2024-04-22 07:34:01       12 阅读
  8. 【Linux】学习记录_15_POSIX信号量

    2024-04-22 07:34:01       12 阅读
  9. 如何在 Apache 和 Nginx 上配置 OCSP Stapling

    2024-04-22 07:34:01       13 阅读
  10. 【Qt】Qt中多线程的使用

    2024-04-22 07:34:01       12 阅读
  11. 使用 ADB 命令在 Android 设备上进行截屏

    2024-04-22 07:34:01       11 阅读