第二次考试总结

2019-04-14 18:01发布


  1.恐怖服装  (halloween.pas/c/cpp)【问题描述】万圣节又到了!农场主—小查打算带他的奶牛去参加一个化装晚会,但是,小查只做了一套能容下两头总长不超过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个整数,表示小黄可选择的所有方案数。注意奶牛顺序不同的两种
     方案是被视为相同的 【输入输出样例1halloweena.in halloween.out 4 6 3 5 2 1   4  输出说明:】

  4种选择分别为:奶牛1和奶牛3;奶牛1和奶牛4;奶牛2和奶牛4;奶牛3和
奶牛4。   【时间限制】   1s第一题开始我想的有点复杂,“注意奶牛顺序不同的两种方案是被视为相同的,这一句我纠结了一会,后来想明白了。这一题我是直接用循环来做的,不用太复杂,先开一个数组,再用一个for循环输入这个数组,再来一个循环,列举如果有两头牛身长不超过sans++,最后输出就可以了。以下代码:#includeusingnamespace std;int a[22000];intmain(){         int n,s,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;         return0;} 2.密码锁  (lock.pas/c/cpp)【问题描述】从前有一个忧桑的故事:农夫小章的奶牛一直从他的农场逃离并且导致了巨额损失。
为了阻止它们逃离,他找来了一只神奇的锁来阻止他的奶牛打开栅栏门。
这个锁有三个密码子,每个都是从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个用空格分开的整数,代表锁匠的密码(很可能和小章的密码相同) 【输出】密码数  【输入输出样例1lock.in lock.out 50 1 2 3 5 6 7 249  【时间限制】   1s这道题我花了很长时间去做。(大概一个半小时有的)试了很多次最终答案都是零,设了多个未知数,循环里的if语句又臭又长。具体不写,太麻烦了,未保存。后来提交的正确代码是这样的:我放弃了循环,因为每个密码只有三个数,可直接用整形定义六个数,这样比较简单。因为我们要把每个数都进行比较,可用三个循环把我们要试的数字枚举出来,再在循环里面用if语句把条件列出来,题目中说“表盘上的数字位置与任意一个密码上的相应数字位置相差不超过2”,一般人可能会想把每个都列出来,就像下面这样:    for(int i=-2;i<=2;i++)    if(i!=0)    {         if(z1+i<=0)          z1=z1+n;         if(z1+i>n)          z1=z1-n;         if(z2+i<=0)          z2=z2+n;         if(z2+i>n)          z2=z2-n;         if(z3+i<=0)          z3=z3+n;         if(z3+i>n)          z3=z3-n;         if(n1+i<=0)          n1=n1+n;        if(n1+i>n)          n1=n1-n;         if(n2+i<=0)          n2=n2+n;        if(n2+i>n)          n2=n2-n;         if(n3+i<=0)          n3=n3+n;        if(n3+i>n)          n3=n3-n;         a1[z1+i]=1;         a2[z2+i]=1;         a3[z3+i]=1;         a1[n1+i]=1;         a2[n2+i]=1;         a3[n3+i]=1;         l1=max(l1,z1+i);         l2=max(l2,z2+i);         l3=max(l3,z3+i);         l1=max(l1,n1+i);         l2=max(l2,n2+i);         l3=max(l3,n3+i);               }这很麻烦,并且容易出错。刚开始我也是这么想的,因为编译不过就放弃了。于是我在一个内部循环中用了bool,以及绝对值。这个锁有三个密码子,每个都是从1-n的整数(1<=n<=100),1和n是相邻的,因为这些密码子是一个圈忘了说这一点,之前刷的时候就忽略了这个。一定要注意。根据这几点我们可以写出下面这个代码:#includeusing namespace std;int main(){         int n,x,y,z,d,e,f,ans=0;         cin>>n;         cin>>x>>y>>z>>d>>e>>f;                      for(inti=1;i<=n;i++)         {                 for(intj=1;j<=n;j++)                 for(intk=1;k<=n;k++)                 {                     int flag=0;                     if((abs(i-d)>n-3||abs(i-d)<3)&&(abs(j-e)>n-3||abs(j-e)<3)&&(abs(k-f)>n-3||abs(k-f)<3)&&flag!=1)ans++,flag=1;                     if((abs(i-x)>n-3||abs(i-x)<3)&&(abs(j-y)>n-3||abs(j-y)<3)&&(abs(k-z)>n-3||abs(k-z)<3)&&flag!=1)ans++,flag=1;                 }//这里是整个代码的核心!!!只要想到这个就可以AC这道题(并且我觉得这个部分和#81圆圈那里有点相似)          }         cout<         return 0;}3.采蘑菇的拖拉机  (tractor.pas/c/cpp)【问题描述】    春天来了,小范的农场里会长很多蘑菇,而观察奶牛开着拖拉机采蘑菇成了小范喜爱做的一件事情。    小范的农场被分为了一个平面坐标系,最左下角的坐标为(1,1),最右上角的坐标为(10^5,10^5.    小范有一个探测蘑菇的雷达,当开启蘑菇雷达后,这个雷达每一秒会发现农场上的一个蘑菇,并且会告知这个蘑菇的坐标。    小范的奶牛只会沿着一个方向开拖拉机,并且不会拐弯,这里的方向指的是和坐标轴平行的四个方向和与坐标轴夹角45度的对角线(当然是两条对角线)。并且每天小范只允许奶牛开一次拖拉机,也就是说,每次采蘑菇,拖拉机只能沿着一个方向去采集所经过的点的蘑菇。    小范允许他的奶牛从农场里的任意一个点,任意一个方向出发,并且他的拖拉机的速度奇快,从启动到完成任务话费的时间忽略不计。现在小范想直到,如果要一次性的采集K个蘑菇,最早在什么时间完成任务。【输入】为了防止骗分,测试数据为两组,每一组数据格式如下:第一行两个整数NK。表示有N个蘑菇出现,小范要采集K个蘑菇。         接下来N行,第i行为两个整数XiYi,表示第i秒发现的蘑菇的坐标为XiYi         在某一个坐标陆续发现多个蘑菇的可能性也是有的。【输出】两行,每行一个整数T,表示最早第T秒就可以完成K个蘑菇的采集。如果无法满足要求,那么这行输出-1. 【输入输出样例1tractor.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 第四秒开始,可以采集第124个蘑菇。 【数据范围】   50% 数据保证 XiYi[1..300]之间  100% 数据保证 N[2..10^6]之间, K[2..N]之间。XiYi[1..10^5]之间。 在考试之前我在看花生那题,我本来以为这题和那题一样也是模拟,但事实上还是有所不同,并且花生那题我还没有完全弄懂。这题我没做,因为做不来以下是zhh同学的代码,fancy讲的我听不大懂,于是就看了其他同学的代码来帮助理解。#includeusing namespace std;int a[100010]={},b[100010]={},c[200010]={},d[200010]={};int n,k;int xi,yi;voidwork(){    cin>>n>>k;         bool flag=true;//要放在work         for(int i=1;i<=n;i++)         {                 cin>>xi>>yi;                 a[xi]++;                 b[yi]++;                 c[xi+yi]++;                 d[100000+xi-yi]++;                 if(flag)                 {                      if(a[xi]==k||b[yi]==k||c[xi+yi]==k||d[100000+xi-yi]==k)                      {                            flag=false;                            cout<<i<<endl;                      }                 }                          }         if(flag)         cout<<-1<<endl;         return;}intmain(){         work();         memset(a,0,sizeof(a));         memset(b,0,sizeof(b));         memset(c,0,sizeof(c));         memset(d,0,sizeof(d));         work();         return0;}这道题我不是很熟,memset函数我还不能熟练运用,好吧,其实是没掌握,包括一些思路我还不是很清晰。这道题等我完全弄懂了会再编辑这一条的。 4.牛语  (latin.pas/c/cpp)【问题描述】奶牛们听说猪发明了一种秘密语言,叫做"猪语",因为猪不想让主人小黄知道他们在商量什么.奶牛们也感觉这样很不错,所以她们想发明他们自己的语言,牛语.想把一个普通的英语单词转换成牛语很简单.如果一个单词的以一个元音字母('a','e','i','o','u)开头,那么只需在 这个单词的结尾加上"cow".例如,"udder"需要变成"uddercow"; 如果一个单词的第一个字母不是元音字母,那么只需把这个单词的第一个字母放到单词结尾,然后再在结尾加上"ow".例如 "farmer"需要变成"armerfow". 所以"the cowsescape at dawn"就会变成"hetow owscow escapecowatcow awndow." 奶牛们自信地以为这样就可以不让小黄知道他们的"越狱"计划. 可惜奶牛们都不是语言学家,他们觉得这样的翻译太无聊了,所以这个任务就交给你了. 你需要将N (1 ≤ N ≤ 100)个英语单词翻译成牛语,单词长度在340之间. 【输入】
  • 第1行: 一个整数N.
  • 第2行到第N+1行: 每行一个单词 【输出】
  • 第1行到第N行,每行一个相应的牛语单词.  【输入输出样例1】
latin.in latin.out 5 udder farmer milk aaa zzz uddercow armerfow ilkmow aaacow zzzow     这道题考察的是字符串的运用,好在我之前看过ppt,还会一点,并且这道题没有那么难弄。对于那个laji我要解释一下!!真的不是蔑视这道题而是之前我看到这题觉得太难了,做不出来,所以想泄私愤觉得这道题十分之恶心(不过没有第三题ex),才定义了一个字符串名称laji,求谅解!!说正事,咳咳。先来一波代码:#includeusingnamespace std;intmain(){         string laji;         int n;         cin>>n;          for(int i=1;i<=n;i++)          {                  cin>>laji;                  if(laji[0]=='a'||laji[0]=='e'||laji[0]=='i'||laji[0]=='o'||laji[0]=='u')                  cout<<laji<<"cow"<<endl;                  else               第二次考试总结  1.恐怖服装  (halloween.pas/c/cpp)【问题描述】万圣节又到了!农场主—小查打算带他的奶牛去参加一个化装晚会,但是,小查只做了一套能容下两头总长不超过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个整数,表示小黄可选择的所有方案数。注意奶牛顺序不同的两种
     方案是被视为相同的 【输入输出样例1halloweena.in halloween.out 4 6 3 5 2 1   4  输出说明:】

  4种选择分别为:奶牛1和奶牛3;奶牛1和奶牛4;奶牛2和奶牛4;奶牛3和
奶牛4。   【时间限制】   1s第一题开始我想的有点复杂,“注意奶牛顺序不同的两种方案是被视为相同的,这一句我纠结了一会,后来想明白了。这一题我是直接用循环来做的,不用太复杂,先开一个数组,再用一个for循环输入这个数组,再来一个循环,列举如果有两头牛身长不超过sans++,最后输出就可以了。以下代码:#includeusingnamespace std;int a[22000];intmain(){         int n,s,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