3 条题解

  • 2
    @ 2026-5-23 9:52:17

    先排序好 负数左 整数右 然后一个个排注意正负数的变化 while的话在这题很合适 没必要for(很多朋友用for)

    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main(){
      
        int n;
        cin >> n;
        int a[100005];
        for(int i=0;i<n;i++)
            cin >> a[i];
        sort(a,a+n);
        int l=0,r=n-1,cnt=0;
        while(l<r)
        {
            int sum=a[l]+a[r];
            if(sum==0)
            {
                cnt++;
                l++;r--;
            }
            else if(sum<0)
                l++;
            else
                r--;
        }
        cout<<cnt;
        return 0;
    }
    
    • 0
      @ 2026-2-9 14:46:35

      #include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,a[100001],r,l=1,t=0; cin>>n; r=n; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1); while(r>l){ int ma=a[l]+a[r]; if(ma==0){ t++; r--; l++; } if(ma>0)r--; if(ma<0)l++; } cout<<t; return 0; }

      • -1
        @ 2026-2-10 15:14:02

        73.和为零(广赋张老师的题解)

        #include <bits/stdc++.h>
        using namespace std;
        
        int main() {
            int n;
            cin >> n;
            int a[100005];
            for (int i = 0; i < n; i++) {
                cin >> a[i];
            }
            sort(a, a+n);// 1. 排序
            // 2. 双指针查找
            int left = 0, right = n - 1;
            int count = 0;
            for(int i=0;i<n;i++){
        		int sum = a[left]+a[right];
        		if(sum==0){		//找到了目标数对,两个指针向中间移动
        			count++;
        			left++;
        			right--;
        		}
        		if(sum<0){left++;}		//左指针的数太小了,左指针向中间移动
        		if(sum>0){right--;}		//右指针的数太大了,右指针向中间移动
        		if(left>right){break;}//如果两个指针碰撞,结束循环
        	}
        	cout<<count;
        
            return 0;
        }
        
        • 1

        信息

        ID
        73
        时间
        1000ms
        内存
        256MiB
        难度
        3
        标签
        递交数
        126
        已通过
        29
        上传者