A Codeforces Round #486 (Div. 3):C.Equal Sums
题意:给出n个数列,判断是否存在这样一对数组,两者均去除一个元素后两数列和相同。
思路:记录去掉某一元素后,该元素对应数列的和。
暴力做法:遍历每一数列的每一元素,看去除该元素后的和是否在之前记录和的容器中存在过,思路是对的,但因为对于数据存储没有处理好(数据结构没选择好),所以输出与时出现了三层循环,TLE。
正解:在存储和的时候,我们可以将这个“子和”与他所在的与绑定,可以结构体也可以对,之后只需要遍历这个存“子和”的容器找到两个相同的和并判断两个“子和”对应数列不是同一个就可以了。。。。。。。在进一步优化,按和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函数判断即可。
D 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的元素的个数。