2 条题解

  • 1
    @ 2025-7-24 10:41:33
    #include<bits/stdc++.h>
    #define int long long
    #define b bool
    using namespace std;
    const int N = 11;
    const int inf = 0x3f3f3f3f;
    int a[N];
    bool hqt[N];
    int sum;
    int n;
    int ans;
    bool dfs(int s , int ans){
    	if(s > sum){
    		return false;
    	}
    	
    	if(sum == s){
    		ans ++;
    		if(ans == 3){	
    			return true;
    		}
    		s = 0;
    	}
    	for(int i = 1 ; i <= n ; i ++){
    		if(hqt[i]){
    			continue;
    		}
    		hqt[i] = true;
    		if(dfs(s + a[i] , ans)){
    			return true;
    		}
    		hqt[i] = false;
    	}
    	return false;
    }
    signed main(){
    	freopen("triangle.in" , "r" , stdin);
    	freopen("triangle.out" , "w" , stdout);
    	cin >> n;
    	for(int i = 1 ; i <= n ; i ++){
    		cin >> a[i];
    		sum += a[i];
    	}
    	if(sum % 3 != 0){
    		cout << "no";
    		return 0;
    	}else{
    		sum /= 3;
    	}
    	if(dfs(0 , 0)){
    		cout << "yes";
    	}else{
    		cout << "no";
    	}
    	return 0;
    }
    
    
    
    • 0
      @ 2025-7-23 19:54:58

      ask一下,陈宇思的题解为什么没有头文件????
      思路:
      首先特判一下棍子长度能不能被3整除 如果不行,就输出no
      首先使用dfs计算三条边的长度,枚举每根木棍加在l1,l2,l3三条边上不同的情况,若dfs中满足三边都等于sum/3,那就输出yes,否则输出no。

      剪枝:如果dfs过程中有某条边大于s/3就回溯,然后枚举到第n根木棍如果还没找到等边三角形,就退出函数。


      • 1

      信息

      ID
      548
      时间
      2000ms
      内存
      256MiB
      难度
      9
      标签
      (无)
      递交数
      470
      已通过
      25
      上传者