SSL 2382 2383 2384 2385 k好数 睡眠 字符串 猜数

提醒:题目在最后,都是水题。


(1)k好数

分析:

模拟,然后如果要优化。
两种方法:
(1)视为 k + 1 k+1 k+1进制:请看链接:借鉴
(2)碰到不符合的跳到符合的(我的方法)


代码

#include <cstdio>
using namespace std;
int n,m,i=1,ans;
int main(){
	freopen("knumber.in","r",stdin);
	freopen("knumber.out","w",stdout);
	scanf("%d%d",&n,&m);
	while (i<=n){
		int j=i,k=1;
		while (j){
		    k=(k<<1)+(k<<3);//k*=10
			if (j%10>m) break;//不符合
			j/=10; 
		}
		if (!j)	i++,ans++;//符合(算完了)
		else i=((i/k+1)*k);//它的前一位加1
	}
	printf("%d",ans);
	return 0;
}

(2)睡眠

代码(太水了)

#include <cstdio>
using namespace std;
int m1,h1,m2,h2,q1,q2;
int main(){
	freopen("sleep.in","r",stdin);
	freopen("sleep.out","w",stdout);
	scanf("%d:%d",&m2,&h2);
	scanf("%d:%d",&m1,&h1);
	m1=m1*60+h1; m2=m2*60+h2;
	if (m1>m2) m2+=1440; 
	m2-=m1; q1=m2/60; q2=m2%60;
	if (q1<10) putchar('0');
	printf("%d:",q1);
	if (q2<10) putchar('0');//记得输出前导0
	printf("%d",q2);
	return 0;
}

(3)字符串

分析

细心发现,当一个 b e a r bear bear出现的时候,产生的子串是 &quot; b e b &quot; e a &quot; r a r &quot; &quot;beb&quot;ea&quot;rar&quot; "beb"ea"rar"前面和后面的乘积,后来,机智的我发现会有重复的,比如: b e a r b e a r bearbear bearbear按照刚才的方法就WA了,用一个last标记前一个bear的位置,so。


代码

#include <cstdio>
#include <cstring>
using namespace std;
char s[3010]; int ans,len,last;
int main(){
	freopen("string.in","r",stdin);
	freopen("string.out","w",stdout);
	scanf("%s",s); len=strlen(s);
	for (int i=3;i<len;)
	if (s[i]=='r'&&s[i-1]=='a'&&s[i-2]=='e'&&s[i-3]=='b') 
	ans+=(i-2-last)*(len-i),last=i-2,i+=4; else i++;//标记前一个的位置,否则直接加
	printf("%d",ans);
	return 0;
} 

(4)猜数

分析

虽然这么多不等式,但是我们可以通过这些获得答案的区间,当不存在区间(impossible),否则输出区间的第一个。


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
int l=-10001,r=10001,n;
int digit(){
	int ans=0,ne=1; char c=getchar();
	while (!isdigit(c)&&c!='-') c=getchar();
	if (c=='-') c=getchar(),ne=-ne;
	while (isdigit(c)) ans=ans*10+c-48,c=getchar();
	return ans*ne;
}
char alpha(){
	char c=getchar();
	while (!isalpha(c)) c=getchar();
	return c;
}
int main(){
	freopen("guess.in","r",stdin);
	freopen("guess.out","w",stdout);
	n=digit();
    for (int i=1;i<=n;i++){
    	char x=getchar(),y,z; int k;
    	while (x!='<'&&x!='>') x=getchar();
    	y=getchar(); k=digit(); z=alpha();
    	if (z=='N') x=(x=='<')?'>':'<',y=(y=='=')?' ':'=';//错误改变符号方向(‘=’也要改变(不是不等式的性质(attention)))
    	if (x=='>')	l=max(l,(y=='=')?k:k+1);//大于更改左边
    	else r=min(r,(y=='=')?k:k-1);//小于更改右边
    }
    if (l>r) puts("Impossible"); else printf("%d",l);
    return 0;
} 

题目

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值