Codeforces Round 916 (Div. 3)(补题)——A---E

文章目录

  • 一、题目+分析+代码
    • [A. Problemsolving Log](#A. Problemsolving Log)
    • [B. Preparing for the Contest](#B. Preparing for the Contest)
    • [C. Quests](#C. Quests)
    • [D. Three Activities](#D. Three Activities)
    • [E. Game with Marbles (Easy Version)](#E. Game with Marbles (Easy Version))

一、题目+分析+代码

A. Problemsolving Log

  • 题目大意就是在问题上花费的时间累计到该问题所需时间即可解决该问题,遍历字符串记一下数即可
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 
map<char,int> mp,num;
 
void solve(){
	for(int i=1;i<=26;i++){
		mp['A'+i-1]=i;
	    num['A'+i-1]=0;
	}
	int n;
	cin>>n;
	string s;
	cin>>s;
	s=" "+s;
	int sum=0;
	for(int i=1;i<=n;i++){
		num[s[i]]++; 
	}
	for(int i=1;i<=26;i++){
		if(num['A'+i-1]>=i)
		  sum++; 
	}	
	cout<<sum<<endl;
}
 
signed main(){
	IOS;
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}

B. Preparing for the Contest

  • 构造一个符合题目的序列即可,因为题目中说了如果有多个答案,则打印其中任何一个
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 

void solve(){
	   int n,k;
	   cin>>n>>k;
	   if(k==n-1)
	     for(int i=1;i<=n;i++)
	       cout<<i<<' ';
	    else{
	    	int m=n-k-1;
	    	while(m--)
	    	  cout<<n--<<' ';
	    	for(int i=1;i<=n;i++)
	    	  cout<<i<<' ';
		}
		cout<<endl;
}

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

C. Quests

  • 前缀和求出第一次解决问题给的经验值,在该问题之前求出最大的完成一次任务之后给的经验值b
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 
map<char,int> mp,num;
struct Node{
	int x,y;
}s[200010];

bool operator < (const Node &A,const Node &B){
	return A.x+A.y>B.x+B.y;
}
bool b[200010];

void solve(){
	int n,k;
	cin>>n>>k;
	vector<int> a(n+1),b(n+1);
	
	for(int i=1;i<=n;i++)
	  cin>>a[i];
	for(int i=1;i<=n;i++)
	  cin>>b[i];
	int sum=0,ans=0,res=0;
	for(int i=1;i<=min(k,n);i++){
		sum+=a[i];
		res=max(res,b[i]);
		ans=max(ans,sum+(k-i)*res);
	}
	cout<<ans<<endl;
}

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

D. Three Activities

  • 因为需要选择三个不同的天 x,y,z,利用贪心的思想,取每个活动前三个最大的,然后求出9种情况的最大值即是朋友人数最大的,
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
typedef pair<int,int> PII; 

struct Node{
	int x,num;
}; 
bool operator < (const Node &A,const Node &B){
	if(A.x!=B.x) return A.x>B.x;
	return A.num<B.num;
} 


void solve(){
	int n;
	cin>>n;
	vector<Node> a(n+1),b(n+1),c(n+1);
	repn(i,1,n) cin>>a[i].x,a[i].num=i;
	repn(i,1,n) cin>>b[i].x,b[i].num=i;
	repn(i,1,n) cin>>c[i].x,c[i].num=i;
	sort(a.begin()+1,a.end());
	sort(b.begin()+1,b.end());
	sort(c.begin()+1,c.end());
 
	int ans=0;
	for(int i=1;i<=3;i++){
		int res=0;
		int ma=a[i].x,na=a[i].num;
	  for(int j=1;j<=3;j++){
	  	if(b[j].num==a[i].num) continue;
	  	int mb=b[j].x,nb=b[j].num;
	    for(int k=1;k<=3;k++){
	    	if(c[k].num==a[i].num||c[k].num==b[j].num)
	    	   continue;
	    	int mc=c[k].x,nc=c[k].num;
	    	res=ma+mb+mc;
	    	ans=max(ans,res);
		 }
	   }
	}
	cout<<ans<<endl;
	
}

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

E. Game with Marbles (Easy Version)

  • 也是思维题,轮到该选手出手时,有两种情况:一是该选手会选择自己身上某颜色最多的弹珠,这样打出一发弹珠后,对手丢弃所有与改弹珠颜色相同的弹珠自己身上就可以保留尽可能多的弹珠了。二是打出一发弹珠使得对面某颜色弹珠最多的都弃掉,这样得分会有利于该选手。所以该选手会选择打出一发弹珠后剩下得弹珠数量+对手弃掉得弹珠数量最大的,即权值之和最大,这里我用优先队列-(大根堆)排序。
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define endl "\n"
#define int long long
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define gcd __gcd
#define repn(i,a,n) for(int i = a; i <= n; i++)
#define rep(i,a,n) for(int i = a; i < n; i++)
struct Info{
	int x,y;
};
 
bool operator < (const Info &A,const Info &B){
	return A.x+A.y<B.x+B.y;
}
 
void solve(){
	int n,ans=0;
	cin>>n;
	vector<int> a(n+1),b(n+1);
	priority_queue<Info> q;
	repn(i,1,n) cin>>a[i];
	repn(i,1,n) cin>>b[i];
	repn(i,1,n) q.push({a[i],b[i]});
	bool flag=true;//Alice出手 
	while(!q.empty()){
		auto t=q.top();
		q.pop();
		//cout<<t.x<<' '<<t.y<<endl;
		if(flag)
		  ans+=t.x-1,flag=false;
		else
		  ans-=t.y-1,flag=true;
	}
		
	cout<<ans<<endl;
}
/*
5
6
3 2 4 2 5 5
9 4 7 9 2 5
*/
 
signed main(){
	IOS;
	int T=1;
	cin>>T;
	while(T--){
		solve();
	}
	return 0;
}
相关推荐
南东山人7 分钟前
一文说清C++类型转换操作符(cast operator)
开发语言·c++
南宫生12 分钟前
力扣-Hot100-二叉树其一【算法学习day.32】
数据结构·学习·算法·leetcode
Darkwanderor15 分钟前
插入排序——希尔排序
c语言·算法·排序算法·希尔排序
decode1241 分钟前
代码随想录算法训练营第三十八天 | 322.零钱兑换 279.完全平方数 139.单词拆分 多重背包以及背包总结
算法
vampire-wpre43 分钟前
我要成为算法高手-二分查找篇
算法
沐泽Mu1 小时前
嵌入式学习-C嘎嘎-Day04
c语言·开发语言·c++·学习
鸣弦artha1 小时前
蓝桥杯——数组
java·数据结构·算法·蓝桥杯·eclipse·排序算法
草原上唱山歌2 小时前
C++需要学习哪些内容?
开发语言·c++·学习
Clrove.112 小时前
C++初阶——queue
开发语言·c++
hunandede2 小时前
FFmpeg 4.3 音视频-多路H265监控录放C++开发十三.3:将AVFrame转换成AVPacket.封装。代码改动
c++·ffmpeg·音视频