9 条题解

  • 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-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
                    标签
                    (无)
                    递交数
                    533
                    已通过
                    178
                    上传者