2022-2023 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2022)

文章目录

  • A. Ace Arbiter
    • 题意:
    • 题解:
    • 代码:
  • C. Coffee Cup Combo
    • 题意:
    • 题解:
    • 代码:
  • D. Disc District
    • 题意:
    • 题解:
    • 代码:
  • H. Highest Hill
    • 题意:
    • 题解:
    • 代码:

A. Ace Arbiter

题意:

Alice和Bob两人打乒乓球十一分制,首先Alice先发两次球,然后Bob发两次球,依次进行,每次发球都会有人得一分,谁发球谁的比分就会在前面,给你按时间顺序的比分,让你判断比分从第几个开始出现错误。

题解:

可通过两人得分的和判断此时进行到第几局,由此可将比分顺序纠正把Alice的比分始终放在前面,然后判断是否合法。

代码:

#include
#include

using namespace std;

const int N=110;
int a[N],b[N];
int main(){
	int n;
	char t;
	int temp=0;
	
	cin>>n;
	
	for(int i=1;i<=n;i++){
		cin>>a[i]>>t>>b[i];
		if((a[i]+b[i])%4==1||(a[i]+b[i])%4==2) swap(a[i],b[i]);
		
	}	
	for(int i=1;i<=n;i++){
		if(a[i]==11&&b[i]==11){
			cout<<"error "<<i<<endl;
			return 0;
		}
		if(a[i]<a[i-1]||b[i]<b[i-1]){
			cout<<"error "<<i<<endl;
			return 0;
		}
		if(temp&&(a[i]>a[i-1]||b[i]>b[i-1])){
			cout<<"error "<<i<<endl;
			return 0;
		}
		if(a[i]==11||b[i]==11) temp=1;
	}
	cout<<"ok"<<endl;
	
	return 0;
}

C. Coffee Cup Combo

题意:

乔娜需要按顺序参加 n n n个会议,每个会议都有一个代号,如果代号为 1 1 1,则表示该会议室有咖啡机,若为 0 0 0则表示没有咖啡机,乔娜最多手可以拿2杯咖啡,乔娜只有喝了 1 1 1杯咖啡才会有精力参加参加这场会议,求乔娜最多有精力参加几场会议。

题解:

若为 1 1 1,则该场会议肯定有精力,且结束后手中会保持 2 2 2杯咖啡,若为 0 0 0,判断手中是否有咖啡,若有则有精力,这时手中的咖啡杯数减一;若无,则没有精力。

代码:

#include
#include
#include

using namespace std;

int main(){
	int n;
	string s;
	int cnt=0;
	int temp=0;
	cin>>n>>s;
	
	for(int i=0;i<n;i++){
		if(s[i]=='1'){
			cnt++;
			temp=2;
		}
		else{
			if(temp>=1){
				cnt++;
				temp--;
			}
		}
	}
	cout<<cnt<<endl;
	
	return 0;
}

D. Disc District

题意:

在二维坐标中给出一个圆心为原点,半径为r的圆,求出距离圆上最近的点,设坐标为(a,b),求出 a 2 a^{2} a2+ b 2 b^{2} b2值最小且大于 r 2 r^{2} r2时a,b的取值。

题解:

a = r a=r a=r b = 1 b=1 b=1时必然满足条件。

代码:

#include
#include

using namespace std;

int main(){
	int r;
	
	cin>>r;
	
	cout<<r<<" "<<'1'<<endl;
	
	return 0;
}

H. Highest Hill

题意:

给定 n n n个数字,表示 n n n个高度,当点 j j j为山顶,点 j j j向左向右都是非严格递减,定义山顶高度为山顶山脚高度差最小值,问全局最大山顶高度。

题解:

l i l_{i} li存储第i个点左边比该点高的点的位置, r i r_{i} ri存储第i个点右边比该点高的点的位置,然后枚举每个点为山顶时的高度差,输出最大的就是结果。

代码:

#include
#include
#include
#define int long long

using namespace std;

const int N=2e5+10;
int a[N],l[N],r[N];
vector<int> ve;

signed main(){
	int n;
	
	cin>>n;
	
	for(int i=1;i<=n;i++) cin>>a[i];
	
	a[0]=1e18;
	a[n+1]=1e18;
	
	for(int i=1;i<=n+1;i++){
		if(!ve.empty()&&a[i]>a[ve.back()])
			while(!ve.empty()){
				r[ve.back()]=i;
				ve.pop_back();
			}
		ve.push_back(i);
	}

	ve.clear();
	for(int i=n;i>=0;i--){
		if(!ve.empty()&&a[i]>a[ve.back()])
			while(!ve.empty()){
				l[ve.back()]=i;
				ve.pop_back();
			}
		ve.push_back(i);
	}
	int ans=-1e18;
	for(int i=1;i<=n;i++) ans=max(ans,min(a[i]-a[l[i]+1],a[i]-a[r[i]-1]));
			
	cout<<ans<<endl;
	
	return 0;
}

你可能感兴趣的:(算法,c++,数据结构)