在上一篇讲了第一和第二题,现在来讲讲第三和第四题。
—————————————废话分割线——————————————
4.牛语(因为太简单而被先拿出来讲的第四题)
题目描述:
给定N个单词,将单词按规则变化后,按原顺序输出。
变化规则:
如果一个单词的以一个元音字母('a','e','i','o','u)开头,那么只需在 这个单词的结尾加上"cow".例如,"udder"需要变成"uddercow"; 如果一个单词的第一个字母不是元音字母,那么只需把这个单词的第一个字母放到单词结尾,然后再在结尾加上"ow".
例如 "farmer"需要变成"armerfow".所以"the cows escape at dawn"就会变成"hetow owscow escapecow atcow awndow."
数据规模:
1<=N<=100,
单词长度:每个不超过40(且保证都为小写)
基本思路:
这道题就是一个字符串操作加强模拟,并且也没有在数据范围上刁难你,按要求模拟即可。
其实这道题还有一个需要注意的细节(第一次做时把我坑惨了):
C++的字符串输入后默认从第0位开始存!!
(原本是P党的我下意识的认为是从第一位开始存的。。)
附上代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
strings;
charp;
intn;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s;
p=char(s[0]);
if(p=='a'||p=='e'||p=='i'||p=='o'||p=='u')
{
cout<<s<<"cow"<<endl;
}
else
{
for(intj=1;j<s.length();j++)
cout<<s[j];
cout<<s[0]<<"ow"<<endl;
}
}
return0;
}
————————————重点题来临分割线——————————————————
3.采蘑菇的拖拉机
题目描述:
一个农场被分为了一个平面坐标系,最左下角的坐标为(1,1),最右上角的坐标为(10^5,10^5).
每秒在农场上都会产生一个蘑菇,并且你会知道它的坐标。
你能从任意一点出发朝八个方向中的任意一个方向采集蘑菇,不能转弯,且只有一次采集机会。(八个方向分别是和坐标轴平行的四个方向和与坐标轴夹角45度的对角线)
求:如果要一次性的采集K个蘑菇,最早在什么时间完成任务。
【输入】
为了防止骗分,测试数据为两组,每一组数据格式如下:
第一行两个整数N和K。表示有N个蘑菇出现,朱昶成要采集K个蘑菇。
接下来N行,第i行为两个整数Xi和Yi,表示第i秒发现的蘑菇的坐标为Xi和Yi。
在某一个坐标陆续发现多个蘑菇的可能性也是有的。
【输出】
两行,每行一个整数T,表示最早第T秒就可以完成K个蘑菇的采集。如果无法满足要求,那么这行输出-1.
数据规模:
50% 数据保证 Xi,Yi在[1..300]之间
100% 数据保证 N在[2..10^6]之间, K在[2..N]之间。Xi和Yi在[1..10^5]之间。
基本思路:
我们要统计所有行,所有列和所有45°对角线什么时候能有k个蘑菇。
我们开4个数组,第1个数组的第i个元素表示第i行的蘑菇数,
第2个数组的第i个元素表示第i列的蘑菇数
对于对角线,我们根据经验,如果两个点的坐标之和相等,是在左下到右上的对角线上,如果两个点的坐标之差相等,是左上到右下的对角线上。
如果坐标要做差,会有负数,我们给每个差+100000的偏移量。
——————————————完·结———————————————————