题解 | #木棍游戏#

满意的数字

https://ac.nowcoder.com/acm/contest/11220/A

C.观察到n只有8,dfs爆搜即可 实际只有2^20次方根本超不了

#include<bits/stdc++.h>
using namespace std;
int vis[10];
double ans;
int num[10];
int n;
bool check(int a[]){
    if(a[1]+a[2]<=a[3]||a[2]+a[3]<=a[1]||a[1]+a[3]<=a[2])
       return 0;
    return 1;
}
double dis(int a[]){
    double p = (a[1]+a[2]+a[3])/2;
    return sqrt(p*(p-a[1])*(p-a[2])*(p-a[3]));
}
void dfs(int now,int a[],int f,int sum){
    if(f==4)
    {
        if(check(a))
        ans = max(ans,dis(a));
        return;
    }
    if(now==n+1){
        if(sum==0)
            return;
        a[f] = sum;
        dfs(1,a,f+1,0);
        return;
    }
    dfs(now+1,a,f,sum);
    if(!vis[now]){
        vis[now] = 1;
        dfs(now+1,a,f,sum+num[now]);
        vis[now] = 0;
    }
}
int main()
{
    cin>>n;
    int a[4] = {0};
    for(int i = 1;i<=n;++i)
       cin>>num[i];
    dfs(1,a,1,0);
    if(ans<0.0000001)
        cout<<-1<<endl;
    else printf("%.1lf",ans);
    return 0;
}
全部评论
#include<bits> using namespace std; const int N = 10; int n; int p[10], w[10]; bool st[10]; bool f = 0; double ans = -1; void dfs(int x) { if(x >= 3) { for(int i = 1; i <= x - 2; i++) { for(int j = 1; j <= x - 2; j++) { if(i + j > x - 1) continue; int a = 0, b = 0, c = 0; for(int q = 1; q <= i; q++) a += w[q]; for(int q = i + 1; q <= i + j; q++) b += w[q]; for(int q = i + j + 1; q <= x; q++) c += w[q]; if(a + b > c && b + c > a && a + c > b) { f = 1; double ppp = (a + b + c) / 2.0; double ttt = sqrt(ppp * (ppp - a) * (ppp - b) * (ppp - c)); ans = max(ans, ttt); } } } if(x == n) return; } for(int i = 1; i <= n; i++) { if(st[i] == 0) { st[i] = 1; p[x] = i; dfs(x + 1); st[i] = 0; } } } void solve() { scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &w[i]); dfs(0); if(f) printf("%.1f\n", ans); else puts("-1"); } int main() { int T = 1; // cin >> T; while(T -- ) { solve(); } return 0; } 老哥,我这个C题只能过个七十几 不知道哪里错了。。</bits>
点赞
送花
回复
分享
发布于 2022-01-13 21:42

相关推荐

点赞 评论 收藏
转发
点赞 评论 收藏
转发
7 1 评论
分享
牛客网
牛客企业服务