D
存在的问题
- 这题想歪了,已经分析出枚举4个顶点后用G[x][y]计算却在如何判断重复边的情况上面没有理清思路
- 同时在该题卡了30分钟后就有了消极的情绪,没有专心思考导致思路不清晰
#include<bits/stdc++.h>
#define For(a) for(int a=0;a<26;++a)
using namespace std;
typedef long long ll;
const int M=55;
ll G[M][M],n,ans;
char str[M];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%s",str);
int m=strlen(str);
G[str[0]-'A'][str[m-1]-'A']++;
}
For(a)For(b)For(c)For(d){
ll &x1=G[a][b];
ll &x2=G[a][c];
ll &x3=G[b][d];
ll &x4=G[c][d];
ll res=1;
res*=x1,x1--;
res*=x2,x2--;
res*=x3,x3--;
res*=x4,x1++,x2++,x3++;
if(res>0)ans+=res;
}cout<<ans;
}
E
思路与切入点
- 如何才能使答案最优呢?我们发现决定答案的有两个因素
- 但是对于每个答案最右边的块只有一个,如果我们已经知道了它,那么我们要使其他的块尽量左,使重心最优
#include<bits/stdc++.h>
using namespace std;
int w[300005],n;
double sum,ans,d;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",w+i);
for(int i=n;i>=2;i--){
sum+=w[i];
d=1.*w[i]/sum;
ans=max(2-d,ans+d);
}printf("%.8f",ans);
return 0;
}