2017.05.14练习赛赛后总结

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值