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暂时不会。