8.7日水题赛(未完。。。)

A Codeforces Round #486 (Div. 3):C.Equal Sums

题意:给出n个数列,判断是否存在这样一对数组,两者均去除一个元素后两数列和相同。

思路:记录去掉某一元素后,该元素对应数列的和。

暴力做法:遍历每一数列的每一元素,看去除该元素后的和是否在之前记录和的容器中存在过,思路是对的,但因为对于数据存储没有处理好(数据结构没选择好),所以输出ij时出现了三层循环,TLE。

正解:在存储和的时候,我们可以将这个“子和”与他所在的ij绑定,可以结构体也可以pair对,之后只需要遍历这个存“子和”的容器找到两个相同的和并判断两个“子和”对应数列不是同一个就可以了o(n^{2})。。。。。。。在进一步优化o(n),按和d 大小排序,这样只要比较相邻两个元素就可以了。

#include<bits/stdc++.h>
#define INF 0x7fffffff
#define ll long long
using namespace std;
int main()
{
    vector <  pair<int,pair<int,int>  >   > v;
    int k;
    cin>>k;
    for(int i=1;i<=k;++i)
    {
        int n;
        cin>>n;
        vector <int> vt;
        int sum=0;
        for(int j=1;j<=n;++j)
        {
            int x;
            cin>>x;
            vt.push_back(x);
            sum+=x;//accumulate(v.begin(),v.end(),0)也可以
        }
        for(int j=0;j<n;++j)
            v.push_back(make_pair(sum-vt[j],make_pair(i,j+1)));

    }
    sort(v.begin(),v.end());
    bool flag=1;
    for(int i=0;i<v.size()-1;++i)
    {
        if(v[i].first==v[i+1].first&&v[i].second.first!=v[i+1].second.first)
        {
            cout<<"YES"<<endl;
            flag=0;
            cout<<v[i].second.first<<" "<<v[i].second.second<<endl;
            cout<<v[i+1].second.first<<" "<<v[i+1].second.second<<endl;
            break;
        }

    }
    if(flag)cout<<"NO"<<endl;
    return 0;
}

B Codeforces Round #486 (Div. 3) A. Diverse Team

题意:给定n个同学,从中找k个同学,要求这k个同学的权值各不相同。

Examples:

Input

5 3
15 13 15 15 12

Output

YES
1 2 5 

思路:标记数组标记已选学生编号即可。

优化:如果无效的学生数过多,标记数组会开很大,会爆炸,因此可以考虑用set标记+vector解决。

C Codeforces Round #486 (Div. 3) B. Substrings Sort

题意:判断给出的n个字符串能不能形成一个“子串序列”。

Examples:

Input

5
a
aba
abacaba
ba
aba

Output

YES
a
ba
aba
aba
abacaba

思路:最后若能形成序列,则字符串一定是从短到长排列的,且相同长度的字符串一定完全相同。所以按长短排序后find函数判断即可。

Codeforces Round #490 (Div. 3) B. Reversing Encryption

题意:按所给方式加密字符串,现有加密后的字符串,问解密后字符串。

思路:reserve函数翻转即可,注意不是加密,是解密。

E Codeforces Round #490 (Div. 3) C. Alphabetic Removals

Examples:

Input

15 3
cccaabababaccbc

Output

cccbbabaccbc

题意:按照题目所给步骤删除字母。

思路:两层循环,一层枚举a~z,一层遍历字符串,删除个数到达k即结束,(之前这里没看明白,k次操作在这里是指执行这一套系统,直到删除某一个元素或者到z结束,算作一个k)。

优化:两层循环如果数据量较大的话必然超时,所以o(n)做法:统计每个字母出现次数,记录第k个元素所对应的字母,小于的跳过,大于的输出,等于的输出  k-前面跳过的个数 个元素。

F Codeforces Round #490 (Div. 3)  D.Equalize the Remainders

G Codeforces Round #490 (Div. 3) A. Mishka and Contest

Examples

Input

8 4
4 2 3 1 5 1 6 4

Output

5

题意:给出一个长度为n的数列,和限制值k,从首端或末端遍历,统计<=k的元素的个数。

H Codeforces Round #486 (Div. 3) D. Points and Powers of Two

猜你喜欢

转载自blog.csdn.net/qq_41661919/article/details/81501385
8.7