13 条题解

  • 2
    @ 2025-11-7 20:39:14
    #include <bits/stdc++.h>
    using namespace std;
    int main(){
        int s,i;
        scanf("%d",&s);
        while(s--){
            int w,n,temp,a[300];
            scanf("%d%d",&w,&n);
            temp=n-1;
            for(i=0;i<n;i++){
                scanf("%d",&a[i]);
            }
            sort(a,a+n);
            for(i=0;temp>i;){
                if(a[i]+a[temp]<=w){n--;i++;temp--;}
                else temp--;
            }
            printf("%d\n",n);
        }
    }
    
    • @ 2025-11-7 20:40:55

      sort排序一下so easy 不想用sort就用冒泡排列一样的,不知道啥叫冒泡排序就自己想办法把一个数组里的数从小到大排序

  • 1
    @ 2024-10-1 16:43:02

    #include <stdio.h>

    int main()

    {

    int s;

    scanf("%d",&s);

    while(s--){

    int w,n;

    scanf("%d %d",&w,&n);

    int sum=0;

    int a[n];

    for(int i=0;i<n;i++){

    scanf("%d",&a[i]);

    }

    for(int i=0;i<n-1;i++){

    for(int j=0;j<n-1-i;j++){

    if(a[j]>a[j+1]){

    int t=a[j+1];

    a[j+1]=a[j];

    a[j]=t;

    }

    }

    }

    int i=0, j=n-1;

    while(i<=j){

    if(a[i]+a[j]<=w){

    i++;

    }

    j--;

    sum++;

    }

    printf("%d\n",sum);

    }

    return 0;

    }

    • 0
      @ 2025-12-8 17:20:41

      #include<stdio.h> #include<algorithm> using namespace std; int main() { int a; scanf("%d",&a); while(a--) { int w,n,i=0; scanf("%d %d",&w,&n); int s[300]; for(i=0;i<n;i++) { scanf("%d",&s[i]); } sort(s,s+n); int temp=n-1; while(temp>i) { if(s[i]+s[temp]<=w) { n--; i++; temp--; } else temp--; } printf("%d\n",n); } return 0; }

      • 0
        @ 2025-10-16 22:35:41
        s = int(input())
        for _ in range(s):
            w, n =map(int,input().split())
            num = list(map(int,input().split()))
            num.sort()
            count = n
            left = 0
            right = n-1
            while left < right:
                if num[left]+num[right]<=w:
                    count -= 1
                    left+=1
                    right-=1
                else:
                    right-=1
            print(count)
        

        双指针

        • 0
          @ 2025-10-5 14:45:35

          #include<stdio.h>

          int main(){

          int t,w,n,x;

          scanf("%d",&t);

          while(t--){

          scanf("%d %d",&w,&n);

          int a[n];

          for(int i=0;i<n;i++){

          scanf("%d",&a[i]);}

          for(int i=0;i<n;i++){

          for(int j=i+1;j<n;j++){

          if(a[i]>a[j]){

          x=a[i];

          a[i]=a[j];

          a[j]=x;}}

          }

          int b=0,sum=0;

          for(int i=n-1;i>=b;i--){

          if(a[i]+a[b]<=w){

          b++;

          }

          sum++;

          }

          printf("%d\n",sum);

          }

          return 0;

          }

          • 0
            @ 2025-9-13 21:23:18

            应该是做过这类题吧,一看到就想到排序和双指针

            from math import sqrt,ceil,gcd,log;re=lambda:map(int,input().strip().split())
            
            for _ in range(int(input())):
                w, n = re()
                a = list(re())
                a.sort()
                num = 0
                l = 0
                r = n - 1
                while l <= r:
                    while a[l] + a[r] > w:
                        r -= 1
                        num += 1
                    l += 1
                    r -= 1
                    num += 1
                print(num)
            

            又能注意到右指针移动一次计数器加1,则算出移动距离就能得出结果,节省一个变量😋

            from math import sqrt,ceil,gcd,log;re=lambda:map(int,input().strip().split())
            
            for _ in range(int(input())):
                w, n = re()
                a = list(re())
                a.sort()
                num = 0
                l, r = 0, n - 1
                while l <= r:
                    while a[l] + a[r] > w:
                        r -= 1
                    l += 1
                    r -= 1
                print(n - 1 - r)
            
            • 0
              @ 2024-10-16 17:51:40

              #include <stdio.h>

              int main() {

              int s; scanf("%d",&s); while(s--){ int w,n; scanf("%d %d",&w,&n); int a[n]; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } for(int i=0;i<n;i++){ for(int j=0;j<n-1-i;j++){ int temp=0; if(a[j]>a[j+1]){ temp=a[j]; a[j]=a[j+1]; a[j+1]=temp; } } } int count=0; int b=n-1; for(int i=0;i<=b;i++){ if(a[i]+a[b]<=w){ count++; b--; }else{ b--; i--; count++; } } printf("%d\n",count); } return 0; }

              • 0
                @ 2023-11-7 23:25:14

                #include<stdio.h> #include<string.h> int vis[205]; int main() { int t; scanf("%d", &t); while (t --) { int k, n; int sum = 0; scanf("%d %d", &k, &n); int a[n + 1]; vis[0] = 1; for (int i = 1; i <= n; i ++) { scanf("%d", &a[i]); vis[a[i]] ++; } int max = 200; while (vis[max] == 0) max --; while (max) { vis[max] --; sum ++; int c = k - max; while (vis[c] == 0) c --; if (c) vis[c] --; while (vis[max] == 0) max --; } printf("%d\n", sum); memset(vis, 0, sizeof(vis)); } return 0; }

                • 0
                  @ 2023-10-21 19:49:24
                  > #include<iostream>
                  using namespace std;
                  int main(){
                      int s;
                      cin>>s;
                      while(s--){
                           int w,n;//承重 人数 
                           cin>>w>>n;
                           int a[n+1];
                           for(int i=0;i<n;i++){
                              cin>>a[i];//输入每个人kg 
                           } 
                           for(int i=0;i<n;i++){//冒泡 
                              for(int j=0;j<n-i-1;j++){
                                  if(a[j]>a[j+1]){
                                      int temp=a[j];
                                      a[j]=a[j+1];
                                      a[j+1]=temp;
                                  }
                              }
                           }
                           int tiaoshu=0;
                           int end=n-1;       
                           for(int i=0;i<=end;i++){
                              if(a[i]+a[end]<=w){
                                  tiaoshu++;
                                  end--;
                              }
                              else{
                                  tiaoshu++;
                                  end--;
                                  i--;
                              }
                           }cout<<tiaoshu<<endl;
                      }
                  }
                  
                  
                  • 0
                    @ 2023-10-21 15:41:01
                    #include<algorithm>
                    using namespace std;
                    int i, j, N, maxload, num, cnt, nums[1009], left, right;
                    bool cmp(int a, int b) {
                    	return a < b;
                    }
                    int main (void) {
                    	scanf("%d", &N);
                    	while (N--) {
                    		cnt = 0;
                    		scanf("%d %d", &maxload, &num);
                    		for (i = 0; i < num; i++) {
                    			scanf("%d", &nums[i]);
                    		}
                    		sort(nums, nums + num, cmp);
                    //		for(i=0;i<num;i++){
                    //			printf("%d ",nums[i]);
                    //				}
                    //		printf("\n");
                    		left = 0;
                    		right = num - 1;
                    		j = 1;
                    		while (left <= right) {
                    //			printf("变之前:\n");
                    //			printf("第%d次:   left=%d   right=%d \n", j, left, right);
                    			if (nums[left] + nums[right] <= maxload) {
                    				cnt++;
                    				left++;
                    				right--;
                    
                    			} else {
                    				right--;
                    				cnt++;
                    			}
                    			if (left >right) {
                    				break;
                    			}
                    //			printf("变之后:\n");
                    //			printf("第%d次:   left=%d   right=%d \n", j, left, right);
                    //			printf("cnt=%d\n",cnt);
                    			j++;
                    		}
                    		printf("%d\n", cnt);
                    	}
                    }
                    
                    • 0
                      @ 2023-10-19 15:39:49
                      #include<iostream>
                      using namespace std;
                      int main()
                      {
                          int s,w,n;
                          cin >> s;
                          while(s--)
                          {
                              cin >> w >> n;
                              int a[300+5]={0};
                              for(int i=0 ; i<n ; i++)
                              {
                                  cin >> a[i];
                              }
                              int temp;
                              for(int i=0 ; i<n-1 ; i++)
                              {
                                  for(int j=0 ; j<n-i-1 ; j++)
                                  {
                                      if(a[j]>a[j+1])
                                      {
                                          temp=a[j];
                                          a[j]=a[j+1];
                                          a[j+1]=temp;
                                      }
                                  }
                              }
                              int cnt=0;
                              for(int i=0,j=n-1 ; i<=j;)
                              {
                                 if(a[i]+a[j]<=w)
                                 {
                                  cnt++;
                                  i++;
                                 }
                                 else
                                 {
                                  cnt++;
                                 }
                                 j-- ;
                              }
                              cout << cnt <<endl;
                          }
                          return 0;
                      }
                      
                      • 0
                        @ 2023-10-18 21:16:34
                        #include <stdio.h>
                        int ar[1000];
                        int main()
                        {
                        	int n,max,pe,chuan,t,j,i;
                        	scanf("%d",&n);
                        	while(n--){
                        		scanf("%d%d",&max,&pe);
                        		chuan=pe;
                        		for(i=0;i<pe;i++){
                        			scanf("%d",&ar[i]);
                        		}
                        		for(i=0;i<pe-1;i++){
                        			for(j=0;j<pe-1-i;j++){
                        				if(ar[j]>ar[j+1]){
                        					t=ar[j+1];
                        					ar[j+1]=ar[j];
                        					ar[j]=t;
                        				}
                        			}
                        		}
                        		for(i=0,j=0;pe-i-1>j;i++){
                        			if(ar[j]+ar[pe-i-1]<=max){
                        				chuan--;
                        				j++;
                        		}  
                        		}
                        		printf("%d\n",chuan);		
                        	}
                        	return 0;
                          }
                        
                        • 0
                          @ 2023-10-9 20:41:04
                          总感觉很麻烦啊
                          #include <stdio.h>
                           
                          #define MAX 305
                           
                          int main()
                          {
                              int T = 0;
                              scanf("%d", &T);    ///获取测试数据组数
                           
                              while(T--)
                              {
                                  int weight_people[MAX]; ///记录每个人的体重的数组
                                  int vis[MAX];   ///记录每个人是否被删除的数据,vis[i] = 0表示这个人已经被运走,不能进行组合
                                  int weight = 0; ///船的最大载重数
                                  int num_people = 0; ///人的数量
                                  scanf("%d%d", &weight, &num_people);
                           
                                  for(int i = 0; i < num_people; i++)
                                  {
                                      scanf("%d", &weight_people[i]); ///循环输入每个人的体重
                                      vis[i] = 1; ///标记每个人
                                  }
                           
                                  int ans = 0;    ///总集合数
                           
                                  for(int i = 0; i < num_people; i++)  ///循环遍历
                                  {
                                      if(0 == vis[i])     ///如果这个人被运走,计算下一个人
                                      {
                                          continue;
                                      }
                           
                                      int key = -1;   ///判断是否有人组合
                                      int max = -2;   ///目前组合的体重
                           
                                      for(int j = 0; j < num_people; j++)
                                      {
                                          if(0 == vis[j] || i == j)     ///如果这个人被运走或者和进行比对的人重复,计算下一个人
                                          {
                                              continue;
                                          }
                           
                                          if(weight_people[i] + weight_people[j] <= weight) ///如果装的下两个人
                                          {
                                              if(weight_people[i] + weight_people[j] > max)   ///这两个人的体重最大
                                              {
                                                  key = j;
                                                  max = weight_people[i] + weight_people[j];
                                              }
                                          }
                                      }
                                      if(-1 != key) ///如果装的下两个人
                                      {
                                          vis[i] = vis[key] = 0;    ///标记这两个人
                                          ans ++; ///总集合数+1;
                                      }
                                      if(-1 == key)   ///没有能与a组合的人,独自上船
                                      {
                                          vis[i] = 0;
                                          ans++;
                                      }
                                  }
                           
                                  printf("%d\n", ans);
                              }
                          }
                          
                          • 1

                          信息

                          ID
                          148
                          时间
                          3000ms
                          内存
                          128MiB
                          难度
                          6
                          标签
                          (无)
                          递交数
                          661
                          已通过
                          217
                          上传者