不知道是第几篇的总结

这个大周的时间特别的短。然而时间还是够我们上好几节的信息课。就在二零一八年三月二十六日晚上五点多的时候,我们,进行了一次考试。这次的考题不是老师出的,我们打的是usaco上面的比赛。然后,除了班级里那个信息课代表大佬,上次过了二十五个点,进了组,剩下的都是铜组滴。于是我们的信息科代表大大,孤军奋战,一个人打银组。


这次的usaco 不得不说没有什么思维含量(这句话绝对不是我说的),但是为什么我还是做不出来啊。我只打了第一题,然后……我过了六个点,其实我还是很开心的,但是呢,代码有华丽丽的一大串。
那个考题还是很变态的。
有编号为A…Z的奶牛。玩#字游戏。说的通俗点呢,就是要你求横排纵列加斜边,到底有几个是三个字母都是一个,还是其中两个一样。我就是这样想的,
但是,当我把代码交上去的时候,却蹦出一大堆我看不懂的英文,于是我上网翻译。那天,我看到了在线翻译的新功能,居然还能翻译成文言文,看来文言文都已经成为一种新语言了。当然,这不是重点,重点是,那一大堆的英文翻译出来的是输出文件错误。然后我发现我忘记把注释去掉了,然后,我就又交了一次。只过了两个点。

因为我还没A,所以我只能放六个点的代码
usaco 是要使用文件输入输出的,不要忘记哦。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    freopen("tttt.in","r",stdin);
    freopen("tttt.out","w",stdout);//看这个“tttt”就知道出题人是多么的随心所欲
    char a[5][5];
    int three=0,two=0;
    for (int i=1;i<=3;i++)
      for (int j=1;j<=3;j++) cin>>a[i][j];
    for (int i=1;i<=3;i++)//判断每一行
      {
        if (a[i][1]==a[i][2]&&a[i][2]==a[i][3]) three++;
          else if (a[i][1]==a[i][2]
                  ||a[i][2]==a[i][3]
                  ||a[i][1]==a[i][3]) two++;
      }
    for (int j=1;j<=3;j++)//判断每一列
    {
        if (a[1][j]==a[2][j]&&a[2][j]==a[3][j]) three++;
          else if (a[1][j]==a[2][j]
                  ||a[2][j]==a[3][j]
                  ||a[1][j]==a[3][j]) two++;
    }
    if ((a[1][1]==a[2][2]&&a[2][2]==a[3][3])||(a[1][3]==a[2][2]&&a[2][2]==a[3][1])) three++;//判断整个斜边都是一种字母的边有几条
    else if ((a[1][1]==a[2][2]||a[2][2]==a[3][3]||a[1][1]==a[3][3])||(a[3][1]==a[2][2]||a[2][2]==a[1][3]||a[3][1]==a[1][3])) two++;//判断斜边上两个字母相同的有几个
    cout<<three<<endl<<two<<endl;
    return 0;   
    fclose(stdin);
    fclose(stdout);
}

除了考试,我还明白了一个新的东东,他就是——预处理。
这么久了,我终于知道他是谁了,终于知道他有什么用了。
预处理可以用空间换时间。用数组存储某些数值,让程序运行时间更短,代价是空间占用会更大。但是空间一般来说都是够用的,256MB,随便挥霍了。所以,用了预处理,那些什么大数据版的我基本上都过了。
就像数组的最大值。我之前不仅连加强版的过不了,就连普普通通的也不会做。但是,我很仔细的看了书之后,在一个夜深人静的夜晚手写了代码。第二天的信息课就把它打出来了,用大数据版的一下过两个。
数组的最大值就是找一个元素左边的最大值和右边的最大值还有不含自身的最大值。总共有k次查询(我最讨厌的就是多组数据了。)
所以代码如下:

#include<bits/stdc++.h>
using namespace std;
int leftmax[500010],rightmax[500010];
int main()
{
    int n,k,a[500010];
    int m;
    cin>>n>>k;
    for (int i=1;i<=n;i++) cin>>a[i];
    a[0]=0,a[n+1]=0;
    for (int i=1;i<=n;i++)
      leftmax[i]=max(leftmax[i-1],a[i-1]);
    for (int j=n;j>=1;j--) 
      rightmax[j]=max(rightmax[j+1],a[j+1]);
    for (int i=1;i<=k;i++)
    {
        cin>>m;
        cout<<leftmax[m]<<" "<<rightmax[m]<<" "<<max(leftmax[m],rightmax[m])<<endl;
    }
    return 0;
}

不长了。


这个大周,我是在做基础的。所以考试的时候我就是按照特别简单的思路打的,但是为什么 会这样就不知道了。
老师说,我们还没有考完,还会在组织我们打一次比赛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值