Codeforces Round #227 (Div. 2)(部分题解)

A. George and Sleep

给两个时间,一个是起床的时间,一个睡觉的时长,问睡觉的时间是几点。

转换成分钟,前者减后者,如果小于0就加上24*60,再换算回来就行了。

#include<cstdio>
int h1,h2,m1,m2;
int main(){
	while(~scanf("%d:%d", &h1, &m1)){
		scanf("%d:%d", &h2, &m2);
		h1=h1*60+m1;
		h2=h2*60+m2;
		h1-=h2;
		if(h1<0)	h1+=24*60;
		printf("%02d:%02d\n", h1/60, h1%60);
	}
	return 0;
}

B. George and Round

给一个A数组和一个B数组,将B调整到使得A数组中每个数字至少出现一次。

B中的数字的数值只能减少不能增加,问至少还要增加多少个数字才能满足条件。

A和B的输入都是按升序排列的,所以只要让B中尽量多的数变成A中的数就行了。

用i 和 j指向两个数组(A和B),遍历B数组,发现Bj>Ai就让i++,最后看A数组还剩下多少个没有匹配到的就是要增加的个数了。

#include<cstdio>
int n, m, i, j, a[3000], b[3000];
int main(){
	while(~scanf("%d %d", &n, &m)){
		for(i=0; i<n; i++)	scanf("%d", &a[i]);
		for(i=0; i<m; i++)	scanf("%d", &b[i]);
		for(i=0,j=0; i<n && j<m; j++){
			if(b[j]>=a[i])	i++;
		}
		printf("%d\n", n-i);
	}
	return 0;
}

C. George and Number

原先有一个数组,其中元素不存在0,每次选择两个数Ai和Aj,使得i!=j && Ai>=Aj,然后将Aj并到Ai后面,加到数组的最后,同时删掉Ai和Aj。

现在给的是一系列操作之后的状态,问原先的数组最多能有多少个元素。

采用贪心的做法,因为元素要多,所以1位数越多越好,所以将后面的数字逐位分离即可。

因为数字不能等于0,也不能有前导0,所以遇到0的时候要稍加判断。先将连续的0的个数累加起来,遇到非0的时候,判断前面的数字是否不小于后面的数字就行了。

#include<cstdio>
#include<cstring>
char s[100010];
int m, cnt, i, j, k, l, a[100010];
int main(){
	while(~scanf("%s", s)){
		m=strlen(s);
		for(i=0; i<m; i++)	a[i]=s[i]-48;
		cnt=0;
		j=0;
		for(i=m-1; i>=0; i--){
			if(a[i]){
				cnt++;
				if(i<j+1)	break;
				if(i==j+1){
					bool flag=1;
					for(k=0,l=i; k<i; k++,l++){
						if(a[k]>a[l])	break;
						if(a[k]<a[l]){
							flag=0;
							break;
						}
					}
					if(!flag)	break;
				}
				j=0;
			}
			else	j++;
		}
		printf("%d\n", cnt);
	}
	return 0;
}

D和E暂时不会。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值