Educational Codeforces Round 41 (Rated for Div. 2)(持续更新中)
题目原文懒得放了,丢个链接:点击打开链接
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:可能会更几个……后边那两个过题人太少的我……