Codeforces Beta Round #6 (Div. 2 Only)

A. Triangle

题意:给定4条边,问能否组成一个三角形。

#include<bits/stdc++.h>
using namespace std;
int a[10];
int main(){
	ios::sync_with_stdio(false);
	cin>>a[0]>>a[1]>>a[2]>>a[3];
	sort(a,a+4);
	if(a[1]+a[2]>a[3]||a[0]+a[1]>a[2])
		puts("TRIANGLE");
	else if(a[1]+a[2]>=a[3]||a[0]+a[1]>=a[2])
		puts("SEGMENT");
	else puts("IMPOSSIBLE");
}

B. President's Office

题意:给出一个办公室的地图以及老板桌子的位置,问老板周围的员工有多少。

#include<bits/stdc++.h>
using namespace std;
char s[105][105];
int vis[30];
int main(){
	ios::sync_with_stdio(false);
	int n,m;
	char c;
	cin>>n>>m>>c;
	int x1,y1,x2,y2,f=0;
	for(int i=1;i<=n;i++)
		cin>>s[i]+1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(s[i][j]==c&&f==0){
				x1=i;
				y1=j;
				f=1;
			}
			if(s[i][j]==c){
				x2=i;
				y2=j;
			}
		}
	}
	int ans=0;
		for(int j=y1;j<=y2;j++){
			if(x1-1>=1&&s[x1-1][j]!='.'&&!vis[s[x1-1][j]-'A']){
				ans++;
				vis[s[x1-1][j]-'A']=1;
			}
		}
		for(int j=y1;j<=y2;j++){
			if(x2+1<=n&&s[x2+1][j]!='.'&&!vis[s[x2+1][j]-'A']){
				ans++;
				vis[s[x2+1][j]-'A']=1;
			}
		}
		for(int i=x1;i<=x2;i++){
			if(y1-1>=1&&s[i][y1-1]!='.'&&!vis[s[i][y1-1]-'A']){
				ans++;
				vis[s[i][y1-1]-'A']=1;
			}
		}
	for(int i=x1;i<=x2;i++){
			if(y2+1<=m&&s[i][y2+1]!='.'&&!vis[s[i][y2+1]-'A']){
				ans++;
				vis[s[i][y2+1]-'A']=1;
			}
		}
	printf("%d\n",ans);
}

C. Alice, Bob and Chocolate

题意:A从左边开始吃巧克力,B从右边,求他们各自吃的巧克力数量。

#include<bits/stdc++.h>
using namespace std;
int t[100005];
long long sum[100005];
int main(){
	ios::sync_with_stdio(false);
	int n;
	cin>>n;
	sum[0]=0;
	for(int i=1;i<=n;i++){
		cin>>t[i];
		sum[i]=sum[i-1]+t[i];
	}
	int l=0;
	while(l<=n){
		if(sum[n]-sum[l-1]>=sum[l]-sum[0])
			++l;
		else break;
	}
	l--;
	printf("%d %d\n",l,n-l);
}

D. Lizards and Basements 2

题意:你是火系魔法师,你面前有n个敌人,给出每个敌人的血量,你只能攻击2-n-1的位置,幸运的是你的攻击可以溅射,问打败所有敌人需要的最少攻击数。

思路:dfs加减枝。

#include<bits/stdc++.h>
using namespace std;
vector<int>ans,tep;
int n,a,b;
int sum,cnt=2e9;
int h[105];
void dfs(int i,int sum){
	if(sum>=cnt)
		return;
	if(i==n){
		if(h[i]<0){
			ans=tep;
			cnt=sum;
		}
		return ;
	}
	for(int j=0;j<=max(h[i]/a+1,max(h[i-1]/b+1,h[i+1]/b+1));j++){
		if(h[i-1]<b*j){
			h[i-1]-=b*j;
			h[i]-=a*j;
			h[i+1]-=b*j;
			for(int k=0;k<j;k++)
				tep.push_back(i);
				dfs(i+1,sum+j);
			for(int k=0;k<j;k++)
				tep.pop_back();
			h[i-1]+=b*j;
			h[i+1]+=b*j;
			h[i]+=a*j;
		}
	}
}
int main(){
	ios::sync_with_stdio(false);
	cin>>n>>a>>b;
	for(int i=1;i<=n;i++)
		cin>>h[i];
	dfs(2,0);
	cout<<cnt<<"\n";
	for(int i=0;i<ans.size();i++)
		cout<<ans[i]<<" ";
} 

E. Exposition

题意:给出一些书的高度,规定一段区间内最高的书与最低的书的高度差小于等于k,求出最长的区间以及区间数量。

思路:线段树加二分。

#include<bits/stdc++.h>
using namespace std;
const int inf=2e9;
const int iinf=-1;
struct node{
	int minn,maxx;
}tr[400005];
int ql,qr,smn,smx;
int n,k;
int ans[100005][2];
void build(int o,int l,int r){
	tr[o].maxx=iinf;
	tr[o].minn=inf;
	if(l==r){
		int x;
		scanf("%d",&x);
		tr[o].maxx=tr[o].minn=x;
		return;
	}
	int m=(l+r)>>1;
	build(o*2,l,m);
	build(o*2+1,m+1,r);
	tr[o].maxx=max(tr[o*2].maxx,tr[o*2+1].maxx);
	tr[o].minn=min(tr[o*2].minn,tr[o*2+1].minn);
}
void qu(int o,int l,int r){
	if(ql<=l&&qr>=r){
		smn=min(smn,tr[o].minn);
		smx=max(smx,tr[o].maxx);
		return;
	}
	int m=(l+r)>>1;
	if(qr<=m)
		qu(o*2,l,m);
	else if(ql>m)
		qu(o*2+1,m+1,r);
	else{
		qu(o*2,l,m);
		qu(o*2+1,m+1,r);
	}
}
int check(int l){
	for(int i=1;i+l-1<=n;i++){
		smn=inf;
		smx = -1;
		ql = i;
		qr = i+l-1;
		qu(1,1,n);
		if(smx-smn<=k)
			return 1;
	}
	return 0;
}
int main(){
	ios::sync_with_stdio(false);
	scanf("%d%d",&n,&k);
	build(1,1,n);
	int l=1,r=n,len=-1;
	while(l<=r){
		int m=(l+r)>>1;
		if(check(m)){
			l=m+1;
			len=max(len,m);
		}
		else r=m-1;
	}
	int cnt=0;
	for(int i=1;i+len-1<=n;i++){
		smn=inf;
		smx =-1;
		ql=i;
		qr = i+len-1;
		qu(1,1,n);
		if(smx-smn <= k){
			ans[cnt][0]=i;
			ans[cnt++][1]=i+len-1;
		}
	}
	cout<<len<<" "<<cnt<<"\n";
	for(int i=0;i<cnt;i++)
		cout<<ans[i][0]<<" "<<ans[i][1]<<"\n";
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值