20171126,三四两题

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;
}                     

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值