CF解题报告:6

T1 Triangle

题目

//借用的他人的代码,比较基础 
#include <bits/stdc++.h>
using namespace std;
int a[4],b[3],flag=0;//a数组存所有木棍长度,b数组用来选取3根木棍
void dfs(int cur,int pla)//cur表示目前b数组已填数字的个数,pla表示前一个填的数在a数组中的位置 
{
	if(cur==3)
	{
		if(b[0]+b[1]>b[2])
			flag=2;
		if(b[0]+b[1]==b[2]&&!flag)
			flag=1;
	}//当b数组中填满3个数字时判断状态 
	else
	{
		for(int i=pla;i<4;i++)
		{
			b[cur]=a[i];
			dfs(cur+1,i+1);
		}
	}//没有满时继续往b数组中填数,满足后填数字比已填数字在a数组中位置靠后 
	return;
}//练习写dfs函数,以解决更具有普遍性的问题(木棍比4根更多时) 

int main()
{
	int i;
	for(i=0;i<4;i++)
		cin>>a[i];//a数组输入各木棍长度 
	sort(a,a+4);//将a数组从小到大排序,以便后续操作 
	dfs(0,0);
	if(flag==0) cout<<"IMPOSSIBLE";
	if(flag==1) cout<<"SEGMENT";
	if(flag==2) cout<<"TRIANGLE";//根据flag状态输出结果 
	return 0;
}

T2 President’s Office

题目

基本操作

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+7;
int n,m,ans;
char o,s[107][107];
map<char,bool>mp;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
void work(int x,int y){
	for(int i=0;i<4;i++){
		int xx=x+dir[i][0],yy=y+dir[i][1];
		if(xx<0||xx>=n||yy<0||yy>=m) continue;
		if(s[xx][yy]<='Z' && s[xx][yy]>='A' && s[xx][yy]!=o && !mp[s[xx][yy]]){
			ans++;
			mp[s[xx][yy]]=1;
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	cin>>o;
	for(int i=0;i<n;i++)
		cin>>s[i];
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			if(s[i][j]==o)
				work(i,j);
	printf("%d\n",ans);
	return 0;
}

T3 Alice, Bob and Chocolate

题目

#include<stdio.h>
using namespace std;
int a[1000005];
int main(){
	int n,i,h,h1;
	scanf("%d",&n);
	for(i=1;i<=n;i++)scanf("%d",&a[i]);
	h=1;h1=n;//分别表示A,B的指针,即吃到哪了
	while(h1-h>1){//主过程,注意循环条件,也可写作h<h1
		if(a[h]<a[h1]){//三个判断,比较简单,自己理解
			a[h1]-=a[h];h++;continue;
		}
		if(a[h]>a[h1]){
			a[h]-=a[h1];h1--;continue;
		}
		if(a[h]==a[h1]){
			h++;h1--;continue;
		}
	}
	printf("%d %d",h,n-h);//输出,注意,因为吃同一个时,A让给B,所以要B++,不过在此A吃的量已经确定,所以只要减一下即可算出B的值,省去了判断。
	return 0;
}

T4 Lizards and Basements 2

题目

暴力DFS即可,注意剪枝

#include <bits/stdc++.h>
using namespace std;
int n,a,b,h[17],sum,ans=1e9,path[167],ansp[167],tmp;
void dfs(int x,int step){
    if(step>=ans) return;
    if(x==n){
        if(h[n]<0){
            ans=step;
            for(int i=0;i<=path[0];i++) ansp[i]=path[i];
        }return;
    }
    for(int i=0;i<=max((h[x-1]/b),max((h[x]/a),(h[x+1]/b)))+1;i++){
        if (h[x-1]<b*i){
            h[x-1]-=b*i;h[x]-=a*i;h[x+1]-=b*i;
            for(int j=1;j<=i;j++) path[++path[0]]=x;
            dfs(x+1,step+i);
            h[x-1]+=b*i;h[x]+=a*i;h[x+1]+=b*i;
            for(int j=1;j<=i;j++) path[0]--;    
        }
    }
}
int main(){
    scanf("%d%d%d",&n,&a,&b);
	for(int i=1;i<=n;i++) scanf("%d",&h[i]);
	dfs(2,0);
    printf("%d\n",ans);
	for(int i=1;i<=ansp[0];i++) printf("%d ",ansp[i]);
}

T5 Exposition

题目

RMQ,用 O ( n l o g n ) O(n logn) O(nlogn)做出ST表后直接查表即可

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int n,k,a,b;
int st[N][30],sr[N][30],h[N],len[N];
bool check(int l,int r){
    int t1,t2,t=log2(r-l+1);
    t1=max(st[l][t],st[r-(1<<t)+1][t]);
    t2=min(sr[l][t],sr[r-(1<<t)+1][t]);
    if(t1-t2<=k) return 1;
    return 0;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++) scanf("%d",&h[i]),st[i][0]=sr[i][0]=h[i];
    int lim=log2(n)+1;
    for(int j=1;j<=lim;j++)
        for(int i=1;i<=n && i+(1<<j)<=n+1;i++)
            st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]),sr[i][j]=min(sr[i][j-1],sr[i+(1<<(j-1))][j-1]);
    for(int i=1;i<=n;i++){
        int l=i,r=n;
        while(l<=r){
            int mid=(l+r)>>1;
            if(check(i,mid)) {
                len[i]=mid-i+1,l=mid+1;
            }else {
                r=mid-1;
            }
        }
        a=max(a,len[i]);
    }
    for(int i=1;i<=n;i++) if(len[i]==a) b++;
    printf("%d %d\n",a,b);
    for(int i=1;i<=n;i++)
        if(len[i]==a) printf("%d %d\n",i,i+a-1);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值