3042. 4个值的和为0(Ⅱ)

帕秋莉_诺蕾姬

此题用枚举两个数和来找另外两个数,注意4个数各不相同,所以要把下标也存入数组,用不定长数组vector比较好

#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
typedef pair<int, int> P;
vector<P>ans[200001];
int main()
{
    ios::sync_with_stdio(false);
    int a[1001], n, s, cnt = 0;
    cin >> n >> s;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    sort(a, a + n);
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j < n; j++)
            ans[a[i] + a[j]].push_back({ i,j });
    for (int i = 0; i<n - 1; i++)
        for (int j = i + 1; j < n; j++)
        {
            int x = s - a[i] - a[j];
            if (x <= 0)
                continue;
            cnt += ans[x].end() - lower_bound(begin(ans[x]), end(ans[x]), P(j, n));//所有数下标小于n
                                                                                   //由于pair排序规则是先比第一个第一个相同再比第二个
                                                                                   //所以此lower_bound返回第一个大于等于P(j,n)的元素可保证下标不重复
        }
    cout << cnt << endl;
}
Li Dao

来自渣渣的一点提示
“其中的数各不相同” “每行一个正整数(小于10^5)”
暗示用数组保存,某个数是否出现过
为防重复算先排序
最后看程序注释处优化

include

using namespace std;
int n,s;
int cnt[100010];
vector V;
int main()
{
cin>>n>>s;
int ans=0;
for(int i=1;i<=n;i++)
{
int xx;cin>>xx;
V.push_back(xx);
cnt[xx]=1;
}
sort(V.begin(),V.end());
for(int i=0;i<V.size();i++)
for(int j=i+1;j=V[j+1]+V[j+2]) //预先判断是否太大
for(int k=j+1;kV[k] && cnt[p]) ans++;
}
cout<<ans<<endl;
return 0;
}

你当前正在回复 博客/题目
存在问题!