目录
A-Problem - A - Codeforces
题意:让我们通过给定的一些数字,构造出一个nice数组,能构造出来就输出数组大小和内容,否则就输出No
思路:有两种方案:
第一种,通过观察样例,“8 12 6 2 4 10”,可以发现这是一个等差数列,萌生了一个想法,当a0>0(a0<0,明显不满足题意,直接输出No)时是不是找到公差d就可以满足构造nice数组的条件了呢?智商不够的我认为排好序的数组中a1-a0即为公差,WA一波,其实公差是所给的一串数字的最大公约数。
另外还需注意特殊情况0存在于所给数组之中,不需额外添加数字使原数字中最大的数字出现在nice数组中。
第二种,更加简单,n最大为100,如果一串数字中没有出现负数,那就直接输出0到100
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
typedef long long ll;
using namespace std;
ll gcd(ll a,ll b){return b==0?a: gcd(b,a%b);}
int main(){
int t;
ll n,a;
// freopen(R"(C:\Users\Vicky\Desktop\ABC\in.txt)","r",stdin);
// freopen(R"(C:\Users\Vicky\Desktop\ABC\out.txt)","w",stdout);
cin>>t;
while (t--){
cin>>n;
vector<ll>v;
for(int i=0;i<n;i++){
cin>>a;
v.push_back(a);
}
sort(v.begin(),v.end());
if (v[0]<0){
cout<<"No"<<endl;
}
else{
ll d=v[0];
for(int i=1;i<v.size();i++)d= gcd(v[i],d);
ll ans= min(d,v[0]);
ll end=v[0]==0?v[v.size()-1]:v[v.size()-1]+d;
cout<<"Yes"<<endl;
cout<<(end-ans)/d+1<<endl;
while (ans<=end){
cout<<ans<<" ";
ans+=d;
}
cout<<endl;
}
}
}
B-Problem - B - Codeforces
题意:从一个给定的字符串中,找到第一个字典序最小的、连续的且不存在于原字符串的字符串
思路:暴力即可。答案的字符串要么是从a-z,要么是从aa-zz,要么是从aaa-zzz,那为啥不是aaaa-zzzz?因为字符串长度为2的时候有676种情况,为3的时候就有种情况了,即17576种情况,但题目中说到The sum of nn over all test cases will not exceed 1000. 所以长度为3就够用了。
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
typedef long long ll;
using namespace std;
void getS(){
freopen(R"(C:\Users\Vicky\Desktop\ABC\in.txt)","r",stdin);
// freopen(R"(C:\Users\Vicky\Desktop\ABC\out.txt)","w",stdout);
}
int main(){
// getS();
int t;
ll n;
string s;
cin>>t;
vector<string>v;
char ch[4]={0};
for(char c='a';c<='z';c++){
ch[0]=c;
v.push_back(ch);
}
for(char c='a';c<='z';c++){
ch[0]=c;
for(char c1='a';c1<='z';c1++){
ch[1]=c1;
v.push_back(ch);
}
}
for(char c='a';c<='z';c++){
ch[0]=c;
for(char c1='a';c1<='z';c1++){
ch[1]=c1;
for(char c2='a';c2<='z';c2++){
ch[2]=c2;
v.push_back(ch);
}
}
}
while (t--){
cin>>n>>s;
for(auto &a:v)if (s.find(a)==string::npos){
cout<<a<<endl;
break;
}
}
}
C-Problem - C - Codeforces
题意:求给定字符串的前缀字符串中,有多少段字符串的比值(D和K的比值)和前缀字符串的比值是一样的
思路:用map<pair<int,int>,int>记录一下即可
#include <iostream>
#include <vector>
#include <algorithm>
#include <map>
#include <fstream>
typedef long long ll;
using namespace std;
map<pair<int,int>,int>cnt;
void getS(){
freopen(R"(C:\Users\Vicky\Desktop\ABC\in.txt)","r",stdin);
// freopen(R"(C:\Users\Vicky\Desktop\ABC\out.txt)","w",stdout);
}
int gcd(int a,int b){
if (a==0)return b;
return b==0?a: gcd(b,a%b);
}
void solve(){
cnt.clear();
int n;
cin>>n;
string s;
cin>>s;
int l=0,r=0;
for(int i=0;i<n;i++){
if (s[i]=='D')l++;
else r++;
int t=gcd(l,r);
cnt[{l/t,r/t}]++;
cout<<cnt[{l/t,r/t}]<<" ";
}
cout<<endl;
}
int main(){
//getS();
int t;
cin>>t;
while (t--){
solve();
}
}