11 条题解

  • 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;

    }

    • 1
      @ 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; }

      • 1
        @ 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
          @ 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-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-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
                        标签
                        (无)
                        递交数
                        563
                        已通过
                        187
                        上传者