Educational Codeforces Round 82 (Rated for Div. 2)

B - National Project

题意: 有一群工人在铺沥青,在好日子的时候铺出来是高质量的,现在有n段路,每天铺一段,好日子g坏日子b,只要铺出来一半的路是高质量的就行,问最少多少天能铺完。
题解: 直接算利用好日子会不会出,如果刚好就不用算后面的b,否则算上b之后加上剩余的(还是看代码比较直观吧)

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std ; 
typedef long long ll ; 
int main(){
	int t; scanf("%d",&t) ; 
	while(t--){
		ll n,g,b; scanf("%lld%lld%lld",&n,&g,&b) ; 
		ll ans ;
		ll x=(n+1)/2 ;
		if(x%g==0){
			ans = x/g*(g+b)-b ; 
		}
		else{
			ans = x/g*(g+b)+x%g ;  
		}
		printf("%lld\n",max(ans,n)) ; 
	}
	return 0 ; 
} 

C. Perfect Keyboard

题意: 给出一串密码,输出26个小写字母,要求按密码的时候密码的字母都相邻
题解: 初始化pos=30,ans[pos]==s[0] ,然后遍历放入,左右放。
①、如果当前字母访问过,则查看pos位置左右是否等于当前字母s[i]=ans[pos-1]
|| s[i]==ans[pos+1] .
②、如果当前字母没有访问过,则看pos位置的左右哪边为空就放入,pos也要移动到当前位置
输出ans中的字母,然后没有访问过的直接输出即可。

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
#include <vector>
using namespace std ; 
typedef long long ll ; 
bool vis[26] ;
char ans[100] ; 
void solve(string s){ 
	memset(vis,false,sizeof(vis)) ; 
	memset(ans,0,sizeof(ans)) ; 
	int pos=30 ;
	ans[pos]=s[0] ,vis[s[0]-'a']=true ; 
	for(int i=1 ; i<s.length() ; ++i){
		int t=s[i]-'a' ; 
		if(vis[t]){
			if(s[i]==ans[pos-1])	--pos ;
			else if(s[i]==ans[pos+1])	++pos ;
			else{
				cout <<"NO"<<endl ; 
				return ;
			}
		}
		else{
			if(!ans[pos-1])	--pos ;
			else if(!ans[pos+1])	++pos ; 
			else{
				cout <<"NO" <<endl ;
				return ; 
			}
			vis[t]=true ; 
			ans[pos]=s[i] ; 
		}
	}
	cout <<"YES"<<endl ; 
	for(int i=0 ; i<100 ; ++i){
		if(ans[i]>='a'&&ans[i]<='z')	cout<<ans[i] ; 
	}
	for(int i=0 ; i<26 ; ++i)
		if(vis[i]==0)	cout<<(char)('a'+i) ;
	cout <<endl ;  
}
int main(){
	int t; cin>>t ;  
	while(t--){
		string s; cin>>s ; 
		solve(s) ; 
	}
	return 0 ; 
} 

D - Fill The Bag(二进制)

题意: 给出n,和长度为m的数组,数组内的输都是2的幂次方,要用数组内的数凑成n,低位可以凑成高位,高位可以拆成低位,问拆高位的最少次数是多少。
题解: 将数组内的数转化为二进制,然后和转化成二进制的n进行计算,具体看图解和代码。
在这里插入图片描述

#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std ; 
typedef long long ll ; 
const int N=60 ;
int a[N] ;
ll n,m ; 
int bit(ll x){
	int cnt=0 ; 
	while(x>1){
		x>>=1 ;
		++cnt ; 
	}
	return cnt ;
}
void solve(){
	int cnt=0 ; //分解次数 
	for(int i=0 ; n>0 ; ++i){
		if(n&1){
			if(a[i]>0)	a[i]-- ; 
			else{
				for(int j=i+1 ; j<60 ; ++j){//找不为0的高位分解 
					if(a[j]){
						--a[j] ; int k=j ; //分解高位 
						while(k!=i){	//逐位分解 
							++cnt ;
							a[--k]++ ;
						}
						a[k] ++ ; 
						break ;  
					}
				}
				a[i]-- ; 
			}
		} 
		a[i+1]+=a[i]/2 ;	//用不到的低位可以凑成高位 
		n >>= 1 ; 
	}
	printf("%d\n",cnt) ; 
} 
int main(){
	int t; scanf("%d",&t) ; 
	while(t--){
		scanf("%lld%lld",&n,&m) ; 
		ll x ,sum=0 ; 
		memset(a,0,sizeof(a)) ; 
		for(int i=0 ; i<m ;++i)	scanf("%lld",&x),sum+=x, ++a[bit(x)] ;
		if(sum<n){
			printf("-1\n") ; 
			continue ; 
		}
		solve() ;	
	}
	return 0 ; 
}
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值