这是第一次把两道题放在一起(之前干过,但之前是由于太闲,现在是由于想获得更多的赞)
P1321 单词覆盖还原
题目描述
我有一个长度为 l 的字符串,最开始时,这个字符串由 l 个句号(.
)组成。
我在这个字符串中,将多次把 boy
或者 girl
两单词,依次贴到这个字符串中。
后贴上单词,会覆盖之前贴上的单词,或者覆盖句号。最终,每个单词至少有一个字符没有被覆盖。
请问,一共贴有几个 boy
几个 girl
?
输入格式
一行被反复贴有 boy
和 girl
两单词的字符串。
输出格式
两行,两个整数。第一行为 boy
的个数,第二行为 girl
的个数。
输入输出样例
输入 #1
......boyogirlyy......girl.......
输出 #1
4 2
说明/提示
数据保证,3≤l≤255,字符串仅仅包含如下字符:.bgilory。
思路:
1.输入字符串
2.在给出的字符串中找出连着的b、o、y或者是g、i、r、l的部分,然后对应的计数器+1
3.输出,注意换行
AC代码:
#include<bits/stdc++.h>//万能头文件
using namespace std;//cin,cout必备
int main()//main主函数开始
{
string s;//定义一个字符串s
cin >> s;//输入(不用getline,没空格)
int a=0,b=0;//a是boy的个数,b是girl的个数
for(int i=0;i<s.size();i++)//遍历字符串
{
if(s[i]=='b'||s[i+1]=='o'||s[i+2]=='y')//连着的boy
{
a++;//计数器+1
}
if(s[i]=='g'||s[i+1]=='i'||s[i+2]=='r'||s[i+3]=='l')//连着的girl
{
b++;//计数器+1
}
}
cout<<a<<"\n"<<b;//输出,注意换行
return 0;//结束程序
}
奉上提交记录:
P1401 [入门赛 #18] 禁止在 int 乘 int 时不开 long long
题目描述
在比赛中,根据数据范围,分析清楚变量的取值范围,是非常重要的。int 类型变量与 int 类型变量相乘,往往可能超出 int 类型可以表示的取值范围。
现在,给出两个 int 类型变量 x,y 及其取值范围,请问 x×y 的值是否可能超过 int 类型可以表示的范围?
提示:int 类型可以表示的范围为 [−2147483648,2147483647],即 [−2^31,2^31−1]。也就是,int 类型可以表示的最小值为 −2147483648,最大值为 2147483647。
输入格式
输入共两行。
输入的第一行为两个整数 xl,xu,表示变量 x 的取值范围为 xl≤x≤xu。
输入的第二行为两个整数 yl,yu,表示变量 y 的取值范围为 yl≤y≤yu。
输出格式
输出一行一个字符串:
- 若会超过,则输出
long long int
; - 若不会超过,则输出
int
。
输入输出样例
输入 #1
1 5 1 5
输出 #1
int
输入 #2
-2147483647 2147483647 -2147483647 2147483647
输出 #2复
long long int
说明/提示
数据规模与约定
- 对于 50%50% 的测试数据,0≤xl≤xu<2^31,0≤yl≤yu<2^31。
- 对于 100%100% 的测试数据,−2^31≤xl≤xu<2^31,−2^31≤yl≤yu<2^31。
思路:
定义一个judge函数(下方有不定义的),两个参数a,b,里面判断a*b是否超过INT_MAX或小于INT_MIN(函数怎么写要教吗?)
AC代码1:
#include<bits/stdc++.h>
using namespace std;
bool f(long long a,long long b)
{
return a*b>=INT_MIN&&a*b<=INT_MAX;
}
int main()
{
long long a,b,c,d;
cin >> a >> b >> c >> d;
if(f(a,c) and f(a,d) and f(b,c) and f(b,d))
{
cout<<"int";
}
else
{
cout<<"long long int";
}
return 0;
}
AC代码2:
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long a,b,c,d;
cin >> a >> b >> c >> d;
if(a*c>2147483647||a*d>2147483647||b*c>2147483647||b*d>2147483647||b*d<-2147483648||b*c<-2147483648||a*d<-2147483648||a*c<-2147483648)
{
cout<<"long long int";
}
else
{
cout<<"int";
}
return 0;
}
还是奉上AC记录:
思路1:AC了!耶!
思路2:代码怎么这么长啊!能短一点吗?!
再提两句:
这道题测试点老多了(104个,前2个和后2个没分,其他1分),所以出现了一些奇怪的东西,比如说这个(这就是我)奇葩,INT_MIN写成了-2147483647导致第101个测试点(Subtask #2第一个)WA还得了100分:啊!INT_MIN写错了!
OK,这篇题解.......就到这里啦,拜拜!(过一会儿你可能会看到P1420 最长连号这玩意儿的题解)