目录
显示
1. My Cow Ate My Homework
题目链接
https://www.luogu.org/problem/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/problem/P4087
题解
(先咕着,因为这题我才拿了40)
3. The Bovine Shuffle
题目链接
https://www.luogu.org/problem/P4089
题解
先放一个非正解,就是暴力模拟。
把整个过程模拟上一定次数,然后判断各个位置上是否有奶牛即可。
(模拟次数少了容易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; }
(正解先咕着)
催更!