Codeforces Round #567 div 2

Codeforces Round #567 div 2

A. Chunga-Changa

题意:
两个人去买椰子,给定他们两人持有的钱数,计算两人可以购买的椰子数量的最大值,并且计算其中一人要给另外一个人的钱数至少是多少。

思路:
对于这道题,可以首先计算出两个人分别能够购买的最大椰子数目,并且算出两个人分别剩下的钱,并根据这些钱计算还能购买几个椰子和应给的钱数。应给的钱数应该是剩余钱较少的人给剩余钱较多的人。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[4];
int main()
{
    ll x,y,z;
    cin>>x>>y>>z;
    ll num1=x/z;
    ll num2=y/z;
    if(x%z==0&&y%z==0)
    {
        cout<<num1+num2<<" "<<0<<endl;
        return 0;
    }
    ll maxn=num1+num2;
    ll num3=x-(num1*z);
    ll num4=y-(num2*z);
    ll minn=0;
    if(num3>=z-num4||num4>=z-num3){
        maxn++;
        minn=min(z-num3,z-num4);
    }
    cout<<maxn<<" "<<minn<<endl;
}

B.Split a Number

题意:
给定一个大数,将其分成两个不为空的部分,其中两个部分的·第一个数字均不能为0,求这两个数的最小和是多少。

思路:
首先我们可以知道,若给出的数的位数为n,那么两个部分的和的最小值最有可能在这两个部分的位数为n/2的时候取得。但是n不一定能被2整除,因此需要比较((n/2),(n-n/2))以及((n-n/2),(n/2))这两种结果的大小。另外需要注意的是,若两个部分中其中一个部分的首位为0,则需要将位数改变。

#include<cstdio>
#include<cstring>
const int N=100050;
short a[N],b[N],c[N],t[N],s[N];
int bl,cl,tl,sl=N,n;
inline void work(int p){
	if(!a[p+1])
        return;
	int i;
	bl=p;cl=n-p;
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	memset(t,0,sizeof(t));
	for(i=1;i<=p;++i)
        b[p-i+1]=a[i];
	for(i=1;i<=cl;++i)
	    c[cl-i+1]=a[p+i];
	tl=bl>cl?bl:cl;//位数
	for(i=1;i<=tl;++i){
		t[i]+=b[i]+c[i];
		if(t[i]>9){
			t[i]-=10;
			++t[i+1];
		}
	}
	if(t[tl+1])
       ++tl;//进位超过范围
	if(tl<sl){
		sl=tl;//位数
		memcpy(s,t,sizeof(s));
	}
	else if(tl==sl){
		bool ok=0;
		for(i=tl;i;i--)
            if(t[i]<s[i])
            {
                ok=1;
                break;
            }
		else if(t[i]>s[i])
            break;
		if(ok)
		   memcpy(s,t,sizeof(s));
	}
}

int main(){
	int i;
	scanf("%d",&n);
	for(i=1;i<=n;++i)
        scanf("%1d",a+i);
	for(i=(n>>1);i&&sl==N;--i)
    {
        work(i);
        work(n-i);
    }
	//if(i>1){work(i-1);work(n-i+1);}
	for(i=sl;i;--i)printf("%d",s[i]);
	return 0;
}

C. Flag

题意:
给定一块由不同颜色组成的布,输出在这块布上能剪出的符合要求的国旗的数目。例如
a a
b b
c c
可以得到三面国旗。
思路:
国旗的要求:1.一面国旗由三种花纹组成,三种花纹的颜色互不相同,且每一行的颜色必须完全相同。 2.每一行的宽度相同。首先将布用一个字符型二维数组表示,并且定义两个二维数组分别表示每一列颜色连续相等的部分和·每一行颜色连续相等的情况。然后,找到国旗的第一层,并且判断该国旗的长度不会超过布的长度,并且通过表示每一列颜色连续相等的情况的数组判断第二层的颜色是否与第一层颜色相等,第三层颜色长度是否至少大于第一层的颜色层数。若条件均满足,则根据另外一个数组判断国旗的最大宽度。宽度为x的国旗共有x中种方案,最后求和即可。

#include <cstdio>
#include <algorithm>

using namespace std;

char c[1200][1200];
int g[1200][1200],h[1200][1200];
int i,j,k,l,m,n;
long long s;

int main()
{
	scanf("%d%d",&n,&m);
	for (i=1;i<=n;i++)
		scanf("%s",c[i]+1);
	for (i=1;i<=n;i++)
		for (j=m;j>0;j--)
			if (c[i][j]==c[i][j+1])
				g[i][j]=g[i][j+1]+1;
			else
				g[i][j]=1;
	for (i=n;i>0;i--)
		for (j=1;j<=m;j++)
			if (c[i][j]==c[i+1][j])
				h[i][j]=h[i+1][j]+1;
			else
				h[i][j]=1;

	for (i=1;i<=n;i++)
		for (j=1;j<=m;j++)
			if ((i+3*h[i][j]-1<=n) && (h[i][j]==h[i+h[i][j]][j]) && (h[i][j]<=h[i+2*h[i][j]][j]))
			{
				for (k=i,l=m;k<i+3*h[i][j];k++)
					l=min(l,g[k][j]);
				s=s+l;
			}
	printf("%I64d",s);
	return 0;
}

未完待续。。。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值