1 条题解

  • 0
    @ 2025-4-12 21:54:24

    C :

    #include<stdio.h>
    #include<stdlib.h>
    int a[21],flog=0,sum,n,vis[21];
    int cmp(const void *c,const void *d)
    {
    	return *(int *)d-*(int *)c;
    }
    void dfs(int cur,int k,int l,int t)
    {
    	int i;
    	if(cur==4)
    	{
    		flog=1;
    		return ;
    	}
    	if(t>n-3)
    		return ;
    	for(i=k;i<n;i++)
    	{
    		if(flog)
    			break;
    		if(!vis[i]&&l<=sum)
    		{
    			vis[i]=1;
    			l+=a[i];
    			if(l==sum)
    			{
    				dfs(cur+1,1,0,1);
    			}
    			dfs(cur,i,l,t+1);
    			vis[i]=0;
    			l-=a[i];
    		}
    	}
    }
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	for(;T>0;T--)
    	{
    		int i;
    		flog=0;
    		sum=0;
    		scanf("%d",&n);
    		for(i=0;i<n;i++)
    		{
    			scanf("%d",&a[i]);
    			sum+=a[i];
    			vis[i]=0;
    		}
    		if(sum%4)//木棒总长应为4的倍数
    			printf("no\n");
    		else
    		{
    			qsort(a,n,sizeof(a[0]),cmp);
    			sum/=4;
    			if(a[n-1]>sum)
    				printf("no\n");
    			else
    			{
    				dfs(1,0,0,1);
    				if(flog==1)
    					printf("yes\n");
    				else
    					printf("no\n");
    			}
    		}
    		
    	}
    	return 0;
    }
    

    C++ :

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    int a[20], u[20], side, S, E;
    
    bool cmp(int a, int b) {
    	return a > b;
    }
    
    int dfs(int s, int l, int k) {
    	if (l == side) {
    		k++;
    		l = 0;
    		s = S;
    	}
    	if (k == 4)
    		return 1;
    	for (int i = s; i <= E; i++)
    		if (!u[i] && l + a[i] <= side) {
    			u[i] = 1;
    			if (dfs(i + 1, l + a[i], k))
    				return 1;
    			u[i] = 0;
    		}
    	return 0;
    }
    
    int main() {
    	int n, m, i, k;
    	scanf("%d", &n);
    	while (n--) {
    		scanf("%d", &m);
    		for (side = i = 0; i < m; i++) {
    			scanf("%d", &a[i]);
    			side += a[i];
    		}
    		if (side % 4) {
    			puts("no");
    			continue;
    		}
    		side /= 4;
    		sort(a, a + m, cmp);
    		memset(u, 0, sizeof(u));
    		for (S = k = i = 0; i < m; i++)
    			if (a[i] > side)
    				break;
    			else if (a[i] == side) {
    				k++;
    				S = i + 1;
    				u[i] = 1;
    			}
    		if (i < m) {
    			puts("no");
    			continue;
    		}
    		if (k == 3 || k == 4) {
    			puts("yes");
    			continue;
    		}
    		E = m - 1;
    		if (dfs(S, 0, k))
    			puts("yes");
    		else
    			puts("no");
    	}
    	return 0;
    }
    

    Pascal :

    var n,k,ans,m,i:longint;
    a:array[1..450]of longint;
    b:array[1..450]of boolean;
    flag:boolean;
    procedure QS(l,r:longint);
    var i,j:longint;
    t,m:qword;
    begin
    i:=l;j:=r;m:=a[(i+j)div 2];
    repeat
    while a[i]>m do inc(i);
    while a[j]<m do dec(j);
    if i<=j then
       begin
        t:=a[i];
        a[i]:=a[j];
        a[j]:=t;
        inc(i);
        dec(j);
       end;
    until i>j;
    if i<r then QS(i,r);
    if j>l then QS(l,j);
    end;
    procedure dfs(x,y,z:longint);
    var i,j,c:longint;
    begin
    for i:=y to m do
    if (b[i])and(a[i]<=z) then
       begin
        b[i]:=false;
        if (x=3)and(z=a[i]) then
         begin
          flag:=true;
          writeln('yes');
          exit;
         end
        else begin
          if z=a[i] then dfs(x+1,1,ans)
           else dfs(x,i+1,z-a[i]);
          b[i]:=true;
          if flag then exit;
             end;
       end;
    end;
    begin
    //assign(input,'square.in');reset(input);
    //assign(output,'square.out');rewrite(output);
    readln(n);
    for k:=1 to n do
    begin
       ans:=0;
       flag:=false;
       fillchar(a,sizeof(a),0);
       fillchar(b,sizeof(b),true);
       read(m);
       for i:=1 to m do
        begin
         read(a[i]);
         inc(ans,a[i]);
        end;
       if ans mod 4<>0 then
         begin
          writeln('no');
          continue;
         end
       else begin
         ans:=ans div 4;
         QS(1,m);
         if a[1]>ans then
          begin
           writeln('no');
           continue;
          end
           else begin
                 dfs(1,1,ans);
                 if not flag then writeln('no');
                end;
             end;
    end;
    //close(input);close(output);
    end.
    
    • 1

    信息

    ID
    2393
    时间
    1000ms
    内存
    32MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者