6 条题解

  • 2
    @ 2022-7-18 7:32:28
    using namespace std;
    int main(){
    	int s;
    	cin>>s;
    	int n;
    	cin>>n;
    	int a[n];
    	for(int i=0;i<n;i++)
    		cin>>a[i];
    	sort(a,a+n);
    	int c=0;
    	for(int i=0,j=n-1;i<=j;i++,j--){
    		c++;
    		if(a[i]+a[j]>s)
    			i--;
    	}
    	cout<<c;
    }
    

    原来只要i<=j就好了

  • 1
    @ 2023-9-22 14:38:14

    双指针拿下

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 20;
    int a[N];
    int w,n,pi;
    int ans;
    
    int main()
    {
        cin >> w >> n;
        for(int i=0;i<n;i++) cin >> a[i];
        sort(a,a+n);
        for(int i=0,j=n-1;i<=j;i++,j--)
        {
            if(a[i]+a[j]>w) i--;
            ans++;
        }
        cout << ans;
        return 0;
    }
    
    • 1
      @ 2022-7-18 16:07:26

      非常好贪心算法,爱来自二刺螈

      #include<bits/stdc++.h>
      using namespace std;
      int a[1000000];
      int main()
      {
      	int w,n,pi=0;
      	cin>>w>>n;
      	for(int i=0;i<n;i++)cin>>a[i];
      	sort(a,a+n);//数据输入+排序
      	for(int i=0,j=n-1;i<=j;i++,j--){
      		pi++;
      		if(a[i]+a[j]>w)i--;
      	}//最关键的贪心算法,将在下面讲解
      	cout<<pi;
      }
      

      for(int i=0,j=n-1;i<=j;i++,j--){
      		pi++;
      		if(a[i]+a[j]>w)i--;
      	}
      

      这个代码是如何成立的? 在排序之后,我们知道最大的数和最小的数是放在末尾和首位的,通过头尾的推进来逼近所给的w值。若两数之和大于w,则末尾的大数分一组,而首位等待下一次分配(这一点是最巧妙的)。若分配完后还剩一个,独立分组后立即退出,不会有任何影响。

      • 0
        @ 2022-7-19 15:50:48
        #include <bits/stdc++.h>
        using namespace std;
        int main()
        {
        	int w,n,a[10000];
        	cin>>w;
        	cin>>n;
        	for (int i=1;i<=n;i++)
        		cin>>a[i];
        	
        	sort(a+1,a+n+1);
        	
        	int i=1,j=n,num=0;
        	while (i<j)
        	{
        		
        		if (a[i]+a[j]<=w)
        		{
        			num++;
        			i++;
        			j--;
        //			cout<<num<<" ";
        			continue;
        		}
        		if (a[i]+a[j]>w)
        		{
        			num++;
        			j--;
        //			cout<<num<<" ";
        			continue;
        		}
        
        	}
        	
        	if (i==j) num++;
        	
        	cout<<num<<endl;
        	
        	return 0;
        }```
        普普通通中规中矩没有什么技术含量的代码……
        
        • 0
          @ 2022-7-19 10:28:30

          #include<bits/stdc++.h> using namespace std; int a[30000000]; int main(){ int n,m; cin>>n>>m; for(int i=1;i<=m;i++){ cin>>a[i]; } int ans=0; sort(a+1,a+1+m); // int r=m; int l=1; // while(l<=r){ int x=a[l]; int y=a[r]; if(x+y>n){ r--; ans++; } else { l++; r--; ans++; } } cout<<ans; return 0; }

          • @ 2022-7-19 10:29:10

            为什么会被压缩

            using namespace std;
            int a[30000000];
            int main(){
            	int n,m;
            	cin>>n>>m;
            	for(int i=1;i<=m;i++){
            		cin>>a[i];
            	}
            	int ans=0;
            	sort(a+1,a+1+m);
            	//
            	int r=m;
            	int l=1;
            	//
            	while(l<=r){
            		int x=a[l];
            		int y=a[r];
            		if(x+y>n){
            			r--;
            			ans++;	
            		}
            		else {
            			l++;
            			r--;
            			ans++;
            		}
            	}
            	cout<<ans;
            	return 0;
            }
            
        • 0
          @ 2022-7-18 7:01:06
          #include<bits/stdc++.h>
          using namespace std;
          int a[10000];
          int main()
          {
          	int n,m,sum=0;
          	cin>>n>>m;
          	for(int i=1;i<=m;i++)
          	{
          		cin>>a[i];
          	}
          	sort(a+1,a+1+m);
          	int i=1,j=m;
          	while(i<=j)
          	{
          		if(a[i]+a[j]<=n)
          		{
          			sum++;
          			i++;
          			j--;
          		}
          		else if(a[i]+a[j]>n)
          		{
          			sum++;
          			j--;
          		}
          		else if(i==j)
          		{
          			sum++;
          			i++;
          			j--;
          		}
          	}
          	cout<<sum;
          	return 0;
          }
          

          一遍过

          • 1

          信息

          ID
          334
          时间
          1000ms
          内存
          128MiB
          难度
          5
          标签
          递交数
          421
          已通过
          155
          上传者