3.采蘑菇的拖拉机
(tractor.pas/c/cpp)
【问题描述】
春天来了,朱昶成的农场里会长很多蘑菇,而观察奶牛开着拖拉机采蘑菇成了朱昶成喜爱做的一件事情。
朱昶成的农场被分为了一个平面坐标系,最左下角的坐标为(1,1),最右上角的坐标为(10^5,10^5).
朱昶成有一个探测蘑菇的雷达,当开启蘑菇雷达后,这个雷达每一秒会发现农场上的一个蘑菇,并且会告知这个蘑菇的坐标。
朱昶成的奶牛只会沿着一个方向开拖拉机,并且不会拐弯,这里的方向指的是和坐标轴平行的四个方向和与坐标轴夹角45度的对角线(当然是两条对角线)。并且每天朱昶成只允许奶牛开一次拖拉机,也就是说,每次采蘑菇,拖拉机只能沿着一个方向去采集所经过的点的蘑菇。
朱昶成允许他的奶牛从农场里的任意一个点,任意一个方向出发,并且他的拖拉机的速度奇快,从启动到完成任务话费的时间忽略不计。现在朱昶成想直到,如果要一次性的采集K个蘑菇,最早在什么时间完成任务。
【输入】
为了防止骗分,测试数据为两组,每一组数据格式如下:
第一行两个整数N和K。表示有N个蘑菇出现,朱昶成要采集K个蘑菇。
接下来N行,第i行为两个整数Xi和Yi,表示第i秒发现的蘑菇的坐标为Xi和Yi。
在某一个坐标陆续发现多个蘑菇的可能性也是有的。
【输出】
两行,每行一个整数T,表示最早第T秒就可以完成K个蘑菇的采集。如果无法满足要求,那么这行输出-1.
【输入输出样例1】
tractor.in | tractor.out |
4 3 1 2 3 4 3 2 4 5 5 2 1 1 2 1 1 2 1 3 1 4 | 4 2 |
第四秒开始,可以采集第1,2,4个蘑菇。
【数据范围】
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的偏移量。
由于本蒟蒻实在是太懒了,就找某位大佬要了一份代码,这位神犇大佬写的代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
bool f=1;
long int sum,a[200001]={},b[200001]={},c[500001]={},d[200001]={},i,j,n,m,x,y;
cin>>n>>m;
for (i=1;i<=n;i++)
{
cin>>x>>y;
a[x]++;
b[y]++;
c[x-y+100000]++;
d[x+y]++;
if ((a[x]>=m||b[y]>=m||c[x-y+100000]>=m||d[x+y]>=m)&&(f))
{
cout<<i<<endl;
f=0;
}
}
if (f)cout<<-1<<endl;
f=1;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
cin>>n>>m;
for (i=1;i<=n;i++)
{
cin>>x>>y;
a[x]++;
b[y]++;
c[x-y+100000]++;
d[x+y]++;
if ((a[x]>=m||b[y]>=m||c[x-y+100000]>=m||d[x+y]>=m)&&(f))
{
cout<<i;
f=0;
}
}
if (f) cout<<-1;
return 0;
}
by黄科海
==========================================================善良的分割线
4.牛语
(latin.pas/c/cpp)
【问题描述】
奶牛们听说猪发明了一种秘密语言,叫做"猪语",因为猪不想让主人陈亮宇知道他们在商量什么.奶牛们也感觉这样很不错,所以她们想发明他们自己的语言,牛语.。想把一个普通的英语单词转换成牛语很简单.如果一个单词的以一个元音字母('a','e','i','o','u)开头,那么只需在 这个单词的结尾加上"cow".例如,"udder"需要变成"uddercow"; 如果一个单词的第一个字母不是元音字母,那么只需把这个单词的第一个字母放到单词结尾,然后再在结尾加上"ow".例如 "farmer"需要变成"armerfow". 所以"the cows escape at dawn"就会变成"hetow owscow escapecow atcow awndow." 奶牛们自信地以为这样就可以不让陈亮宇知道他们的"越狱"计划. 可惜奶牛们都不是语言学家,他们觉得这样的翻译太无聊了,所以这个任务就交给你了. 你需要将N (1 ≤ N ≤ 100)个英语单词翻译成牛语,单词长度在3到40之间.
【输入】
- 第1行: 一个整数N.
- 第2行到第N+1行: 每行一个单词 保证每个单词都是小写字符组成
【输出】
- 第1行到第N行,每行一个相应的牛语单词.
【输入输出样例1】
latin.in | latin.out |
5 udder farmer milk aaa zzz | uddercow armerfow ilkmow aaacow zzzow
|
思路 :一道非常水难的模拟加字符串。。。
看到这张图了吗,竟然这么多人把这题A了,突然发现Oj上的大佬真是越来越多了呢,看来我真是太蒟了,跟神犇们简直没法比。(请无视被涂掉的那个人,别问我为什么,因为那是我自己) 。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,t=0;
string s;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>s;
if(s[0]=='a'||s[0]=='e'||s[0]=='i'||s[0]=='o'||s[0]=='u') cout<<s<<"cow"<<endl;
else
{
for(int j=1;j<s.size();j++)
{
cout<<s[j];
}
cout<<s[0]<<"ow"<<endl;
}
}
return 0;
}