题目原文懒得放了,丢个链接:点击打开链接

A:平台上有n个槽,然后要往里面放1*1的方块,如果n个槽的底部同时有方块那么所有槽底下的方块同时去掉,然后你得一分!……

想起了什么经典游戏呢哈哈哈……

数据较小,暴力查找就行:

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,a[1010],t,sum=0;
    scanf("%d%d",&n,&m);
    memset(a,0,sizeof(a));
    for(int i=0;i<m;i++)
    {
        scanf("%d",&t);
        a[t]++;int j;
        for(j=1;j<=n;j++)
        {
            if(a[j]==0)
                break;
        }
        if(j==n+1)
        {
            for(j=1;j<=n;j++)
            {a[j]--;}sum++;
        }
    }
    printf("%d\n",sum);
}

B:题意

        有个人去上高数课,但是困倦是人之常情~如果老师在第i分钟讲a[i]个定理,你睡着和醒着的状态用t[i]表示。有这么一种“神药”,吃了之后能保证你从现在到k分钟后全是清醒的,不过因为吃药太多会变成傻子,记下定理也看不懂,所以只能用一次药。问他这一节课最多能记多少个定理?

        题解1:(自己的)首先求出一个记录从开始到现在正常情况下能记多少定理的数组。然后求出一个从开始到现在都醒着的情况下能记多少定理。然后对用药的也就是全醒的一段区间进行枚举,找出最大解。

解释一下这行代码:

sum=qz[i-1]+qz0[i+k-1]-qz0[i]+a[i]+((n-1!=i+k-1)?(qz[n-1]-qz[i+k]+(t[i+k]?a[i+k]:0)):0);
qz[i-1]代表之前正常的时候记了多少定理
qz0[i+k-1]-qz0[i]+a[i]代表用药的区间记了多少定理
((n-1!=i+k-1)?(qz[n-1]-qz[i+k]+(t[i+k]?a[i+k]:0)):0);代表对之后药效过去以后,恢复正常到下课记了多少定理。这里我要判断一下是不是用药结束立马就下课了,否则数组会存在越界。

还有,第三个式子里面的问号表达式代表恢复正常以后,少加的一个量要加回来,但是只有不睡着的时候才能加。

        题解2:(队友的)(即将更新)

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,k,a[110010],t[110010],qz[110010],qz0[110001];
    memset(qz,0,sizeof(qz));
    scanf("%d%d",&n,&k);
    int ssa=0,sst=0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
        ssa+=a[i];
        qz0[i]=ssa;
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&t[i]);
        if(t[i])
        {
            sst+=a[i];
        }
        qz[i]=sst;
    }
    int maxx=0,ii=0;
    for(int i=0;i<n-k+1;i++)
    {
        int sum=0;
        sum=qz[i-1]+qz0[i+k-1]-qz0[i]+a[i]+((n-1!=i+k-1)?(qz[n-1]-qz[i+k]+(t[i+k]?a[i+k]:0)):0);
        if(sum>maxx)
        {
            maxx=sum;
            ii=i;
        }
    }
    printf("%d\n",maxx);
}


C-E:可能会更几个……后边那两个过题人太少的我……