A - Diverse Team
签到题就不多说了。
#include <cstdio>
int find[105];
int main(){
int n,k,distinc=0,a;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a);
if(!find[a]){find[a]=i;distinc++;}
}
puts(distinc>=k?"YES":"NO");
if(distinc>=k){
for(int i=1;i<=100&&k;i++){
if(find[i])printf("%d ",find[i]),k--;
}
}
}
B - Substrings Sort
题目已经提示得很明显了,把字符串排序一下,如果 Str[i] S t r [ i ] 不在 Str[i+1] S t r [ i + 1 ] 里,那么就不符合题意。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string a[105];
bool cmp(string x,string y){
int a=x.length(),b=y.length();
if(a!=b)return a<b;
return x<y;
}
int main(){
int n;
ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<n;i++){
if(a[i+1].find(a[i])==string::npos){
cout<<"NO";
return 0;
}
}
cout<<"YES"<<endl;
for(int i=1;i<=n;i++){
cout<<a[i]<<endl;
}
}
C - Equal Sums
用map记录 sum[i]−s[i][j] s u m [ i ] − s [ i ] [ j ] 的值,由于 ∑ni≤2⋅105 ∑ n i ≤ 2 ⋅ 10 5 ,所以这样做是可行的。
#include <cstdio>
#include <cctype>
#include <map>
#include <utility>
using namespace std;
const int BufferSize=1<<16;
char buffer[BufferSize],*head,*tail;
inline char GET_CHAR(){
if(head==tail){
int l=fread(buffer,1,BufferSize,stdin);
tail=(head=buffer)+l;
if(head==tail)return EOF;
}
return *head++;
}
inline int READ(){
int x=0,f=1;char c=GET_CHAR();
for(;!isdigit(c);c=GET_CHAR()){
if(c==EOF)return EOF;
if(c=='-')f=-1;
}
for(;isdigit(c);c=GET_CHAR())x=(((x<<2)+x)<<1)+c-'0';
return x*f;
}
typedef pair<int,int> pii;
map<int,pii> find;
int ni,a[200005],sum;
int main(){
int n=READ();
for(int i=1;i<=n;i++){
ni=READ();
sum=0;
for(int j=1;j<=ni;j++){
a[j]=READ();
sum+=a[j];
}
for(int j=1;j<=ni;j++){
if(find.count(sum-a[j])){
pii ans=find[sum-a[j]];
printf("YES\n%d %d\n%d %d\n",ans.first,ans.second,i,j);
return 0;
}
}
for(int j=1;j<=ni;j++){
find[sum-a[j]]=make_pair(i,j);
}
}
puts("NO");
}
D - Points and Powers of Two
稍微写一下就会知道这样的集合元素一共不会超过三个,了解这个就可做了。
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
map<int,bool> ref;
int a[200005];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
ref[a[i]]=1;
}
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
for(int bit=0;bit<32;bit++){
if(ref.count(a[i]+(1<<bit))&&ref.count(a[i]+(1<<(bit+1)))){
printf("3\n%d %d %d",a[i],a[i]+(1<<bit),a[i]+(1<<(bit+1)));
return 0;
}
if(a[i]+(1<<bit)>a[n]||a[i]+(1<<(bit+1))>a[n])break;
}
}
for(int i=1;i<=n;i++){
for(int bit=0;bit<32;bit++){
if(ref.count(a[i]+(1<<bit))){
printf("2\n%d %d",a[i],a[i]+(1<<bit));
return 0;
}
if(a[i]+(1<<bit)>a[n])break;
}
}
printf("1\n%d",a[1]);
}
/*
3
-1 -10 -50
*/
E - Divisibility by 25
简单搜索,把不需要考虑的字符用相同字符代替可以极大减小搜索空间。
#include <cstdio>
#include <string>
#include <utility>
#include <map>
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
queue<pair<string,int> >Q;
map<string,bool> geted;
string ss;
int getf[500],dic[500],p[500];
int rp='0'*11;
int bfs(){
if(ss.size()==2&&getf[ss[0]*10+ss[1]-rp])return 0;
pair<string,int> tmp;
int step,len=ss.size();
for(int i=len-1;i>=0;i--){
if(p[7]&&ss[i]=='7')ss[i]='9'+1;
if(p[5]&&ss[i]=='5')ss[i]='9'+1;
if(p[2]&&ss[i]=='2')ss[i]='9'+1;
if(p[1]&&ss[i]=='1')ss[i]='9'+1;
p[ss[i]-'0']++;
}
//cout<<ss<<endl;
if(!((p[0]>=2)||(p[2]&&p[5])||(p[5]&&p[0])||(p[7]&&p[5])))return -1;
Q.push(make_pair(ss,0));
while(Q.size()){
tmp=Q.front();Q.pop();
step=tmp.second;
string &s=tmp.first;
//cout<<s[len-1]+s[len-2]*10-rp<<" "<<s<<endl;
if(getf[s[len-1]+s[len-2]*10-rp])return step;
if(s[1]!='0'){
if(dic[s[0]-'0']){
swap(s[0],s[1]);
if(!geted[s]){
Q.push(make_pair(s,step+1));
geted[s]=1;
//cout<<s<<" "<<step<<endl;
}
swap(s[0],s[1]);
}
}
for(int i=2;i<len;i++){
if(!dic[s[i-1]-'0'])continue;
swap(s[i],s[i-1]);
if(!geted.count(s)){
Q.push(make_pair(s,step+1));
geted[s]=1;
//cout<<s<<" "<<step<<endl;
}
swap(s[i],s[i-1]);
}
}
return -1;
}
int main(){
dic[0]=dic[2]=dic[5]=dic[7]=1;
getf[25]=getf[50]=getf[75]=getf[0]=1;
long long n;
scanf("%I64d",&n);
while(n){ss.push_back(n%10+'0');n/=10;}
reverse(ss.begin(),ss.end());
printf("%d",bfs());
}