关于第二次考试的总结与反思

  知道回校要考试,没想到来得这么快。

  先从本人认为比较满意的开始讲起:


先拍题:

春天来了,朱昶成的农场里会长很多蘑菇,而观察奶牛开着拖拉机采蘑菇成了朱昶成喜爱做的一件事情。

朱昶成的农场被分为了一个平面坐标系,最左下角的坐标为(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]之间。


好吧这题一开始拿到的时候是一脸懵逼的,然后试了一试开一个二维数组farm[10^5][10^5],然后尴尬地发现太大了,于是只好从头开始。

然后不知怎么的,脑子中突发灵感:

#include <bits/stdc++.h>
int len1[1000005]={};
int len2[1000005]={};
int len3[2000005]={};
int len4[2000005]={};
using namespace std;
int main()
{
	int n,k;
	int mx,my;
	bool flag=0;
	ios::sync_with_stdio(false);
	for(int j=1;j<=2;j++)
	{
	  cin>>n>>k;
	  if(k>n)
	  {
	  cout<<"-1";
	  return 0;
	  }
	  for(int i=1;i<=n;i++)
	  {
		cin>>mx>>my;
		len1[mx]++;
		len2[my]++;
		len3[mx+my]++;
		len4[1000000-(mx-my)]++;
		if(flag==0)
		  if(len1[mx]==k||len2[my]==k||len3[mx+my]==k||len4[1000000-(mx-my)]==k)
		     {cout<<i<<endl;flag=1;}
	  }
	memset(len1,0,sizeof(len1));
	memset(len2,0,sizeof(len2));
	memset(len3,0,sizeof(len3));    
	memset(len4,0,sizeof(len4)); 
	if(flag==0)
	{
		cout<<"-1"<<endl;
		continue;
	} 
	flag=0;
    }
    return 0;
} 

其实这一个灵感也不得不归功于以前做过的一道差不多的题目。然后就成功地发现标黄的那一句话完全是用来拐(xv)人(wei)的,这类把二维数组转化为一维数组的题目也是做了好多遍,而找规律的图却把我折磨了好一镇子,但这题还是给了我较大的启发。
1.这一题再一次证明了二维数组的橫行,纵行,斜行都是有规律可循的。
2.这一题也告诉我对于空间复杂度的把我的重要性,要不是因为本人对空间没有概念,所以才出现了farm[10^5][10^5]的尴尬情况。
3.再者,这一题也建立起了我一些有关于数据的输入与输出的一些概念(这里的数据一定要输入完毕才能开始输入下一组,所以不能有break)(据说某蒟蒻就是因为没有注意数据的输入而只拿了10分),是我对bool型变量也有了一些新的看法。
4.这题还告诉我,类比很重要。

至于"牛语",本人觉得这题有点,啊不,实在是太水了,所以不做评论。


然后是两个悲伤的故事


先是化妆晚会,
拍题:

万圣节又到了!Farmer John打算带他的奶牛去参加一个化装晚会,但是,FJ只做了一套能容下两头总长不超过S(1 <= S <=1,000,000)的牛的恐怖服装。FJ养了N(2 <=N <= 20,000)头按1..N顺序编号的奶牛,编号为i的奶牛的长度为Li(1 <= Li <= 1,000,000)。如果两头奶牛的总长度不超过S,那么她们就能穿下这套服装。FJ想知道,如果他想选择两头不同的奶牛来穿这套衣服,一共有多少种满足条件的方法。

【输入格式】

* 第1行: 2个用空格隔开的整数:N 和 S

* 第2..N+1行: 第i+1为1个整数:L_i

【输出格式】

第1行: 输出1个整数,表示FJ可选择的所有方案数。注意奶牛顺序不同的两种方案是被视为相同的

【输入样例】 (costume.in):

4 6

3

5

2

1

【输出样例】 (costume.out):

4

【输出说明】

4种选择分别为:奶牛1和奶牛3;奶牛1和奶牛4;奶牛2和奶牛4;奶牛3和奶牛4。

【结题报告】

先将数据快排,然后枚举当前值,通过二分法查找其后符合条件的值。


由于这是第一题,所以数据的范围改成了10000,但就是这么一道送分题,本人华丽丽地做超时了。

#include <bits/stdc++.h>
using namespace std;
int n,s;
int cows[20001]={};
int rec(int bian,int d,int p)
{
	if(d>n)
	  return 0;
	if(bian>s)
	  return 0;
	if(bian<=s&&p==2)
	  return 1;
	if(p>2)
	  return 0;
	int k=rec(bian,d+1,p);
	int l=rec(bian+cows[d],d+1,p+1);
	return  k+l;
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>s;
	for(int i=0;i<n;i++)
	  cin>>cows[i];
	int p=rec(0,0,0);
	cout<<p;
	return 0;
} 

太信任递归导致车祸。

因当好好反思:
1.对于爆搜的不信任,导致了我对数据规模往往看都不看一眼。
2.对于递归的认识不够透彻,不想优化,导致超时。
3.自习速度慢,导致什么二分都没听说过。

再者
密码锁:

农夫约翰的奶牛不停地从他的农场中逃出来,导致了很多损害。为了防止它们再逃出来,他买了一只很大的号码锁以防止奶牛们打开牧场的门。

    农夫约翰知道他的奶牛很聪明,所以他希望确保它们不会在简单地试了很多不同的号码组合之后就能轻易开锁。锁上有三个转盘,每个上面有数字1..N (1 <= N <= 100),因为转盘是圆的,所以1和N是相邻的。有两种能开锁的号码组合,一种是农夫约翰设定的,还有一种“预设”号码组合是锁匠设定的。但是,锁有一定的容错性,所以,在每个转盘上的数字都与一个合法的号码组合中相应的数字相距两个位置以内时,锁也会打开。

    比如说,如果农夫约翰的号码组合是(1,2,3),预设号码组合是(4,5,6),在转盘被设定为(1,N,5)(因为这和农夫约翰的号码组合足够接近)或(2,4,8)(因为这和预设号码组合足够接近)。注意,(1,5,6)并不会打开锁,因为它与任一号码组合都不够接近。  给出农夫约翰的号码组合和预设号码组合,请计算能够开锁的不同的号码组合的数目。号码是有序的,所以(1,2,3)与(3,2,1)不同。

PROGRAM NAME: comb
INPUT FORMAT

第一行:整数N。

第二行:三个以空格分隔的整数,为农夫约翰的号码组合。

第三行:三个以空格分隔的整数,为预设号码组合(可能与农夫约翰的号码组合相同)。

SAMPLE INPUT (file comb.in)

50

1 2 3

4 5 6

OUTPUT FORMAT

第一行:所有不同的能够开锁的号码组合的总数。

SAMPLE OUTPUT (file comb.out)

249



因为本人的代码太过虚伪,不给出。

怎么说呢,据本班一位蒟蒻说,这一题竟然还是爆搜!!!!!!!


1.思维的活性不够,导致脑子短路……

所以因为这一题本来就没有思路,所以目前单凭别人的思路好像也总结不出什么。



本次考试的总结也就到此为止了,希望以后再接再厉,不断提高。





猜你喜欢

转载自blog.csdn.net/airno2/article/details/80229402