光棍节练习赛1、2题题解与反思

来源:互联网 发布:淘宝货源插件 编辑:程序博客网 时间:2024/04/29 18:33

第二篇题解:

B. usaco2017feb_bronze Why Didthe Cow Cross the Road1

题目描述

猫为什么过马路是一个历史悠久的问题,并且得到了科学界极大的重视。令人惊讶的是,关于犬过马路的研究文献却很少。犬国军政大臣HSQ意识到了问题的重要,于是他与犬国大学合作研究这一问题。HSQ的工作就是记录犬穿过马路的次数,他认真的记录了关于犬的位置的数据,并在一天内进行了一系列观察。它记录了每只犬的编号和特在马路的哪一侧(编号是个整数且小于等于10,因为犬国只有10只犬)根据农民约翰记录的数据,请帮助他计算确定的犬过马路的次数。如果连续看到一只犬出现在道路的两侧,就会确认过了一次马路

输入格式

第一行输入包含观察次数N,一个最多为100的正整数。

接下来N行每一行包含一个观察结果,由两个数构成,第一个数是犬编号,第二个数是01,表示位置(道路一侧为0,另一侧为1)。

输出格式

一个数据,输出过马路次数。。

样例数据

input

8
3 1
3 0
6 0
2 1
4 1
3 0
4 0
3 1

output

3

在这个例子中,犬3过马路两次特首先出现在第1侧,然后出现在第0边,然后再出现在第1边。犬4过马路一次。犬26似乎没有过马路。

数据规模与约定

翻译来自2020届: @102黄加瑜 @102慕昊天 @102叶景楠 @周靖涵

时间限制:1s1s

空间限制:256MB

这题我也没解,我一开始就没有看懂题目,然后悲剧了……不过还好,对了样例。

思路:这题有很多解法,我也不知道很多(香菇蓝瘦),现在介绍一位大佬的解法。

 代码如下:

#include <bits/stdc++.h>
using namespace std;
int main()
{
       int n,x,y,s=0;
       cin>>n;
       int a[11];
       for(int i=1;i<=10;i++)
       a[i]=2;
       for(int i=1;i<=n;i++)
       {
              cin>>x>>y;
              if(a[x]!=y&&a[x]!=2)
                s++;
      a[x]=y;
       }
       cout<<s;
       return 0;
}

具体的没看太懂……(呜呜呜),像我们这种蒟蒻,只能膜拜。

大概就是在两边马路不在一边,就累加(我怎么没想到呢,被自己蠢哭了)。

操作:输入;

赋初值(不能是0或1);

循环并判断:是否不等于初值并不等于上次输入,成立则累加;

输出。

完~~~~~~

第二题:

 想哭~~,为什么会有银组题……

题目描述

农夫约翰发现,当他的奶牛在附近有另一头奶牛获得其他奶牛支持时候,他就更容易挤牛奶了。因此,他想把他的M头奶牛(M < 1000000000,M是偶数)分割为M/2对。然后,每一对将被引到谷仓里的一个单独的小隔间里挤奶。每一个隔间的挤牛奶将同时进行。

让事情变得有点复杂的是,每一个农夫约翰的奶牛都有不同的产奶量。如果奶牛产奶量是AB,那么就需要用A+B的时间来给它们挤奶。

请帮助农场主约翰确定整个挤奶过程所需的最短时间。

输入格式

第一行为N1<N<100 000接下来的N行每一行都有两个整数x,y,表示有x头奶牛的产奶量为y(1≤y≤1,000,000,000)。x的和是整数M

输出格式

输出整个过程的最短时间。

样例数据

input

3 
1 8
2 5
1 2

output

10

样例说明:这里 4头奶牛的产奶量为2558。显然,将他们分为2+85+5所需的时间最短(其他任意分配都会导致有一组奶牛的时间超过10),所需时间为10

数据规模与约定

翻译来自 2020杨崇烨胡家烨司胜杰周玥

时间限制:1s1s

空间限制:256MB

这题想都没想去做,混了个样例;

还是大佬代码:

#include<bits/stdc++.h>
using namespace std;
struct niu{
       int b,c;
}a[100010]; 
       int x,y,m,n;
       int mx;
int cmp(niu x,niu y){
       return x.c<y.c;
}
int work(){
       x=1;y=n;mx=0;
       while (x<=y){
              int sum=a[x].c+a[y].c;
              if (sum>mx) mx=sum;
              if(a[x].b>a[y].b){
                    a[x].b-=a[y].b;
            y--; 
              }
              if(a[x].b==a[y].b){
                    x++;y--;
              }
              if(a[x].b<a[y].b){
                    a[y].b-=a[x].b;
                    x++;
              }
       }
    return mx;       
}
int main(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
      scanf("%d%d",&a[i].b,&a[i].c);
    sort(a+1,a+n+1,cmp);
    work();
    printf("%d",mx);
       return 0;
}

这次是真大佬:我表示我看不懂,更纪念品分组差不多(该死的背包、动态规划),具体自行理解吧(没办法,我看不懂)…………

完~~~~~

原创粉丝点击