首页 > 其他分享 >AtCoder Beginner Contest 376 题解

AtCoder Beginner Contest 376 题解

时间:2024-11-01 12:42:56浏览次数:1  
标签:AtCoder return cout int 题解 ans define id 376

AtCoder Beginner Contest 376 题解

AtCoder Beginner Contest 376


A - Candy Button

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve(){
	int n,c;cin>>n>>c;
	int pre=-1;
	int ans=0;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		if(pre==-1){
			pre=x;
			ans++;
		}
		else if(x-pre>=c){
			pre=x;
			ans++;
		}
	}
	cout<<ans<<endl;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

B - Hands on Ring (Easy)

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int n;
bool check(int l,int m,int r){
	return (l<m && m<r);
}
int step(int s,int t,int b){
	if(s==t) return 0;
	if(s>t) t+=n;
	if(check(s,b,t) || check(s,b+n,t)){
		return n-(t-s);
	}
	else return t-s;	
}
void solve(){
	int q;cin>>n>>q;
	int l=0,r=1;
	int ans=0;
	while(q--){
		char op;cin>>op;
		int p;cin>>p;
		p--;
		if(op=='L'){
			ans+=step(l,p,r);
			l=p;
		}
		else{
			ans+=step(r,p,l);
			r=p;
		}
	}
	cout<<ans<<endl;

}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

C - Prepare Another Box

#include<bits/stdc++.h>
#define endl '\n'
#define int long long 
using namespace std;
const int N=2e5+10;
int a[N],b[N],tmp[N];
int n;
bool check(int x){
	for(int i=1;i<=n-1;i++) tmp[i]=b[i];
	tmp[n]=x;
	sort(tmp+1,tmp+n+1);
	for(int i=1;i<=n;i++){
		if(a[i]>tmp[i]) return false;
	}
	return true;
}
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n-1;i++) cin>>b[i];
	sort(a+1,a+n+1);
	int l=0,r=1e9;
	int ans=-1;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			r=mid-1;
			ans=mid;
		}
		else l=mid+1;
	}
	cout<<ans<<endl;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

D - Cycle

解题思路

  • 包含点1的最小环,直接从点1开始跑bfs,第一次回到点一时的路径长度即为环的大小
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N=2e5+10;
typedef pair<int,int> PII;
bool vis[N];
vector<int> g[N];
void solve(){
	int n,m;cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;cin>>u>>v;
		g[u].push_back(v);
	}
	queue<PII> q;
	q.push({1,0});
	vis[1]=1;
	int ans=0;
	while(!q.empty()){
		auto t=q.front();
		q.pop();
		auto [u,d]=t;
		for(auto v:g[u]){
			if(v==1){
				ans=d+1;
				cout<<ans<<endl;
				return;
			}
			if(vis[v]) continue;
			vis[v]=1;
			q.push({v,d+1});
		}
	}
	cout<<-1<<endl;
}
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T=1;
	while(T--) solve();
	return 0;
}

E - Max × Sum

解题思路

  • 枚举ai,只需要维护满足aj<=ai的前k-1小的bj的和,用优先队列简单维护
  • 一个trick,可以单独记录id数组,对id数组排序时依赖a,b数组的值,这样就可以不对a,b数组进行改变
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int a[N],b[N];
bool cmp(int x,int y){
	return a[x]<a[y];
}
void solve(){
	int n,k;cin>>n>>k;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	vector<int> id(n);
	//iota函数,为区间按顺序加1赋值
	//记录id数组,可以方便排序
	iota(id.begin(),id.end(),1);
	sort(id.begin(),id.end(),cmp);
//	for(auto x:id) cout<<x<<endl;
	priority_queue<int> q;
	int sum=0;
	int ans=1e18;
	for(int i=0;i<n;i++){
		int idx=id[i];
		while(q.size()>k){
			auto t=q.top();
			q.pop();
			sum-=t;
		}
		if(i>=k-1){
			int tmp=0;
			if(i>=k) tmp=q.top();
			else tmp=0; 
			ans=min(ans,a[idx]*(sum-tmp+b[idx]));
		}
		q.push(b[idx]);
		sum+=b[idx];
	}
	cout<<ans<<endl;
}
signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--) solve();
	return 0;
}

标签:AtCoder,return,cout,int,题解,ans,define,id,376
From: https://www.cnblogs.com/personaowl/p/18519917

相关文章

  • dp专题总结 - AtCoder DP Contest
    dp专题总结题单:this w......
  • 洛谷 P2606 [ZJOI2010] 排列计数 题解
    题目链接[ZJOI2010]排列计数-洛谷题解看到\(p_i>p_{\lfloori/2\rfloor}\)这个条件,可能一开始不会有什么想法。但是如果我们换种写法,即:\(p_i<p_{2i}\landp_i<p_{2i+1}\)。这样我们就能很容易看出来,这是小根堆的形式。现在我们从根节点开始考虑,假设左子树的大小......
  • P1779 魔鬼杀手 题解&&思路
    P1779魔鬼杀手题解&&思路题目链接。分析题目性质我们发现假如有状态表示\(M\)个方案选或不选,那么这个状态有唯一确定的结果,即结果不会随着施法的顺序而改变。考虑\(dp.\)我们从题目出发,发现每个方案有单个攻击或者集体攻击,想一想从这个方面考虑。又由于每一个方案是可......
  • 洛谷Python顺序结构题解合集
    P5705【深基2.例7】数字反转a=s[0]b=s[1]c=s[2]d=s[4]print(f"{d}.{c}{b}{a}")P5706【深基2.例8】再分肥宅水ans=float(a[0])/int(a[1])beizi=2*int(a[1])print(f"{ans:.3f}\n{beizi}")P5708【深基2.习2】三角形面积p=0.5*(a+b+c)ans=pow((p*(p-a)*(p-b)*(p-c)),0.5......
  • Navicat 连接 MySQL 失败:2002-can‘t connect to server on localhost(10061)问题解决
    连接不上问题可能有如下原因服务器安全组中没有配置3306端口mysql服务端口只开放本地了如下:修改/etc/mysql/mysql.conf.d/mysqld.cnf中bind-address和mysqlx-bind-address注释掉重启mysql服务systemctlrestartmysqlmysql登录用户的host为localhost只允......
  • CATIA许可证常见问题解答
    在使用CATIA软件的过程中,许可证问题常常是用户关心的焦点。为了帮助大家更好地理解和解决这些问题,我们整理了一份CATIA许可证常见问题解答,希望能为您提供便捷的参考。问题一:如何激活CATIA许可证?解答:激活CATIA许可证通常需要访问软件的官方平台或使用特定的许可证管理工具。您需......
  • 20241031模拟赛题解
    T1题目描述给定一个圆形蛋糕,被\(n\)条切割线分成\(n\)个扇形蛋糕块,按照顺时针编号,第\(i\)块上有\(a_i\)个草莓,第\(i\)条切割线到第\(i+1\)条切割线之间的部分是第\(i\)块蛋糕。Alice和Bob流选择切割线,假设Alice选择了第\(i\)条切割线,Bob选择了第\(j\)条......
  • Codeforces Global Round 27,D. Yet Another Real Number Problem 题解
    单调栈+贪心题意:给定一个序列从左往右对于每个索引iii,求出其前缀的数组可以进行任意次以下操作的条件下:选择......
  • 2024CCPC哈尔滨部分题解
    赛时被评测机卡死了M.奇怪的上取整求\(\sum_{i=1}^{n}f(n,i)\)\(Input\)第一行一个整数\(T(1<=T<=10^3)\),表示数据组数对于每组数据,一行一个整数\(n(1<=n<=10^9)\)\(Output\)对于每组数据,输出一行一个整数,表示答案。\(Sample\)35451114514————————21T10......
  • Apache Commons Net 共享SSLSession问题解决
        某些服务器会默认开启TLS会话恢复,如FileZillaServer1.0及以后的版本(相对于1.0以前版本就是先当与勾选了RequireTLSsessionresumptionondataconnectwhenusingPORTP)。ApacheCommonsNet目前是不支持TLS会话恢复的,所以我们只能通过重写FTPSClient来实现。不然你......