不知不觉就第二次考试了;
荀彧同学由于有些事没有完成考试;
但是今天回来还是好好的完成了所有题;
确实学到了很多;
1>恐怖服装
上题目:
【问题描述】
万圣节又到了!农场主—小查打算带他的奶牛去参加一个化装晚会,但是,小查只做了一套能容下两头总长不超过S(1 <= S <= 1,000,000)的牛的恐怖服装。小查养了N(2 <= N <= 20,000)头按1..N顺序编号的奶牛,编号为i的奶牛的长度为Li(1 <= Li <= 1,000,000)。如果两头奶牛的总长度不超过S,那么她们就能穿下这套服装。
小查想知道,如果他想选择两头不同的奶牛来穿这套衣服,一共有多少种满足
条件的方案。
【输入】
* 第1行: 2个用空格隔开的整数:N 和 S
* 第2..N+1行: 第i+1为1个整数:Li
【输出】
* 第1行: 输出1个整数,表示小黄可选择的所有方案数。注意奶牛顺序不同的两种
方案是被视为相同的
【输入输出样例1】
halloweena.in |
halloween.out |
4 6 3 5 2 1
|
4 |
【输出说明:】
4种选择分别为:奶牛1和奶牛3;奶牛1和奶牛4;奶牛2和奶牛4;奶牛3和
奶牛4。
【时间限制】
1s
这是一道无比适合暴力枚举的题目;
而且改题目的一定是我们嘤才班的某位可爱的蒟蒻;
感谢刘大佬没有放上很恶心的测试数据;
让暴力枚举爆掉;
反而ac了;
暴力枚举的代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,s,a[20100],ans=0;
cin>>n>>s;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
if(a[i]+a[j]<=s)
ans++;
}
cout<<ans<<endl;
return 0;
}
二重循环的暴力搜索;
让两头牛一头一头配对;
简单快捷;
但是!
听说这题还可以用凑出一个世界的二分法来做;
这里就不提供代码了;
毕竟二分法还不在我的理解范围之内;
end...
2>密码锁
上题目:
【问题描述】
从前有一个忧桑的故事:农夫小章的奶牛一直从他的农场逃离并且导致了巨额损失。
为了阻止它们逃离,他找来了一只神奇的锁来阻止他的奶牛打开栅栏门。
这个锁有三个密码子,每个都是从1-n的整数(1<=n<=100),1和n是相邻的,因为这些密码子是一个圈。有两组密码能够打开这个锁,一个是农夫小章的,另一个是锁匠的。然而,这个锁有一个小的容错的几率,它会打开只要表盘上的数字位置与任意一个密码上的相应数字位置相差不超过2。比如,如果小章的密码是(1,2,3),锁匠的密码是(4,5,6)。如果你的输入是(1,n,5)(因为这和小章的密码很相近)或者是(2,4,8)(因为这和锁匠的密码很接近),这个锁都会打开,。注意,(1,5,6)无法打开这个锁,因为它和任何一个密码都不接近。
给出小章的密码和锁匠的密码,请找出所有不同的能打开锁的密码的数目。另外,(1,2,3)和(3,2,1)是不同的。
【输入】
第一行:一个整数n
第二行:3个用空格分开的整数,代表小章的密码
第三行:3个用空格分开的整数,代表锁匠的密码(很可能和小章的密码相同)
【输出】
密码数
【输入输出样例1】
lock.in |
lock.out |
50 1 2 3 5 6 7 |
249 |
【时间限制】
1s
这道题依旧是某位嘤才改的题吧;
看到这个题目依旧想到暴力枚举;
开了一个万恶的三重循环;
有可能超时;
但是!
一开始没有考虑周全;
忘记了两个数的绝对值应该大于n-3;
于是就……凉凉;
后来仔细想了想;
代码就是这样的:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a1,a2,a3,b1,b2,b3,ans=0;
cin>>n;
cin>>a1>>a2>>a3;
cin>>b1>>b2>>b3;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
{
bool flag=0;
if((abs(i-a1)>n-3||abs(i-a1)<3)&&(abs(j-a2)>n-3||abs(j-a2)<3)&&(abs(k-a3)>n-3||abs(k-a3)<3)&&flag!=1)
ans++,flag=1;
if((abs(i-b1)>n-3||abs(i-b1)<3)&&(abs(j-b2)>n-3||abs(j-b2)<3)&&(abs(k-b3)>n-3||abs(k-b3)<3)&&flag!=1)
ans++,flag=1;
}
cout<<ans<<endl;
return 0;
}
三重循环+bool判断;
可以暴力出一个世界;
所以说;
做题时脑子要清醒啊;
要看清题目的条件;
不要像荀彧同学一样那道题目扫一眼就开始敲代码;
往往花的时间又多还容易错;
end...
3>采蘑菇的拖拉机
很好,依旧是一道被某个嘤才改过的题目;
考试四道题里面最难的;
内心绝望;
上题目:
【问题描述】
春天来了,小范的农场里会长很多蘑菇,而观察奶牛开着拖拉机采蘑菇成了小范喜爱做的一件事情。
小范的农场被分为了一个平面坐标系,最左下角的坐标为(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 |
4 2 |
第四秒开始,可以采集第1,2,4个蘑菇。
【数据范围】
50% 数据保证Xi,Yi在[1..300]之间
100% 数据保证N在[2..10^6]之间, K在[2..N]之间。Xi和Yi在[1..10^5]之间。
附上子皿六日大佬的注释代码;
跟我的思路是一样的;
只不过人家的有注释;
看的更清楚一点吧:
#include<bits/stdc++.h>
using namespace std;
int a[100001],b[100001],c[200000],d[200000]; //先定义四个数组,分别代表横、竖、对角线四个方向
int n1,n2,k1,k2,xx,yy; //因为有两组数据,所以我设了两遍(讲真我就是被这玩意坑死的)
int main()
{
cin>>n1>>k1;
int flag1=0; //表示还不能采蘑菇
for(int i=1;i<=n1;i++)
{
cin>>xx>>yy; //输入蘑菇坐标
a[xx]++; //横的++
b[yy]++; //竖的++
c[100000+xx-yy]++; //左上到右下方向的++
d[200000-xx-yy]++; //右上到左下方向的++
if(flag1==1) continue; //表示已经采了,这是为了防止重复输出,但是因为还有蘑菇的坐标没有读入,所以循环还不能停
if(a[xx]>=k1||b[yy]>=k1) //达到要求就采蘑菇(我这里是因为后来补上所以分成两个 )
{cout<<i<<endl; flag1=1;}
if(c[100000+xx-yy]>=k1||d[200000-xx-yy]>=k1)
{cout<<i<<endl; flag1=1;}
}
if(!flag1) cout<<-1<<endl; //表示没有达到要求
memset(a,0,sizeof(a)); //因为还有一组,所以要把数组清空
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
cin>>n2>>k2;
int flag2=0;
for(int i=1;i<=n2;i++)
{
cin>>xx>>yy;
a[xx]++;
b[yy]++;
c[100000+xx-yy]++;
d[200000-xx-yy]++;
if(flag2==1) continue;
if(a[xx]>=k2||b[yy]>=k2)
{cout<<i<<endl; flag2=1;}
if(c[100000+xx-yy]>=k2||d[200000-xx-yy]>=k2)
{cout<<i<<endl; flag2=1;}
}
if(!flag2) cout<<-1<<endl;
return 0;
}
/*斜行行数和蘑菇坐标的东西可以通过数学得到关系式
具体怎么弄看个人习惯
我是以对角线作为第100000行的*/
很坑人的一道题;
重点是要在中间把所有数据清空;
又见到了久违的memset;
懂了就好了;
end...
4>牛语;
还是嘤才改过的题;
令人很无语的无脑基础字符串题;
上题目:
【问题描述】
奶牛们听说猪发明了一种秘密语言,叫做"猪语",因为猪不想让主人小黄知道他们在商量什么.奶牛们也感觉这样很不错,所以她们想发明他们自己的语言,牛语.。想把一个普通的英语单词转换成牛语很简单.如果一个单词的以一个元音字母('a','e','i','o','u)开头,那么只需在 这个单词的结尾加上"cow".例如,"udder"需要变成"uddercow"; 如果一个单词的第一个字母不是元音字母,那么只需把这个单词的第一个字母放到单词结尾,然后再在结尾加上"ow".例如 "farmer"需要变成"armerfow". 所以"the cowsescape at dawn"就会变成"hetow owscow escapecowatcow 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 |
然而;
荀彧同学第一次做的时候开了两个下标!!!
(emmmmm 黑人问号?!)
后来脑子清楚了想明白了;
没事给字符串开个数组干嘛;
直接输入不就好了;
再在每一个单词里面开个数组好了呀;
下表一下判断一下就没问题了;
输出的时候开个for循环;
从第二个字母开始输出就ojbk了;
上代码:
#include<bits/stdc++.h>
using namespace std;string a;
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
if(a[0]=='a'||a[0]=='e'||a[0]=='i'||a[0]=='o'||a[0]=='u')
cout<<a<<"cow"<<endl;
else
{
for(int j=1;j<a.size();j++)
cout<<a[j];
cout<<a[0]<<"ow"<<endl;
}
}
return 0;
}
无脑输入;
无脑判断;
无脑输出;
就是这么干脆;
end...
最后再总结一下吧;
虽然说这次考试没有完整的参与;
但是题目都是看了一遍的;
发现自己还是存在很多不足的;
刷题的时候太水;
导致基础不是很扎实;
下一阶段减少刷题量;
提高质量吧;
再把基础的东西好好看一看补一补;
以前做过的题在自己敲一遍;
老母猪可能是真的要停经了;
但是;
以后不仅回生还会养了呀!!!
荀彧同学fighting吧;
全文终。