USACO 2017 Dec Silver

1. My Cow Ate My Homework

题目链接

https://www.luogu.org/problemnew/show/P4086

题解

首先,我们从后向前遍历数组,求出后缀和和后缀最小值。

然后,枚举\(k\)的值即可。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int mins[100005],a[100005],post[100005],re[100005],cnt,n;
long double ans;
int main()
{
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
  scanf("%d",&a[i]);
 mins[n]=post[n]=a[n];
 for(int i=n-1;i>=1;i--)
 {
  mins[i]=min(mins[i+1],a[i]);
  post[i]=post[i+1]+a[i];
 }
 for(int k=1;k<=n-2;k++)
 {
  long double cur=((long double)post[k+1]-mins[k+1])/(n-k-1);
  if(ans<cur)
  {
   ans=cur;
   memset(re,0,sizeof(re));
   re[cnt=1]=k;
  }
  else if(ans==cur)re[++cnt]=k;
 }
 for(int i=1;i<=cnt;i++)
  printf("%d\n",re[i]);
 return 0;
}

2. Milk Measurement

题目链接

https://www.luogu.org/problemnew/show/P4087

题解

(先咕着,因为这题我才拿了40)

3. The Bovine Shuffle

题目链接

https://www.luogu.org/problemnew/show/P4089

题解

先放一个非正解,就是暴力模拟。

把整个过程模拟上一定次数,然后判断各个位置上是否有奶牛即可。

(我才不会告诉你们,这个真的要靠RP,模拟次数少了容易WA,次数多了会TLE)

#include <stdio.h>
#include <string.h>
int a[100005],b[100005],c[100005];
int main()
{
 int n;
 scanf("%d",&n);
 for(int i=1;i<=n;i++)
  a[i]=1;
 for(int i=1;i<=n;i++)
  scanf("%d",&c[i]);
 for(int i=1;i<=500;i++)//最慢的点跑了328ms
 {
  for(int i=1;i<=n;i++)
   b[c[i]]+=a[i];
  memset(a,0,sizeof(a));
  for(int i=1;i<=n;i++)
   a[c[i]]+=b[i];
  memset(b,0,sizeof(b));
 }
 int ans=0;
 for(int i=1;i<=n;i++)
  if(a[i])ans++;
 printf("%d",ans);
 return 0;
}

(正解先咕着)

发表评论

电子邮件地址不会被公开。 必填项已用*标注