11.22 Educational Codeforces Round 65 (Rated for Div. 2)

总结:

小组情况:3/2/1

A. Telephone Number

思路:好像做了很多次的电话号码问题,跟后面十位数无关,只要前面有8即可。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
 
const int manx=1e5+5;
 
int main()
{
    ll p=read();
    while(p--)
    {
        ll n=read();
        string s;
        cin>>s;
        ll flag=1;
        for(int i=0;i<=n-11;i++)
            if(s[i]=='8')
            {
                put1();
                flag=0;
                break;
            }
        if(flag) put2();
 
    }
    return 0;
}

B. Lost Numbers

思路1:暴力遍历每个排序,判断是否跟输入的值一样,当12345 前面五位确定的时候,第6位也确定了。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
 
const int manx=1e5+5;
map<int,ll>vis;
ll a[6]={4,8,15,16,23,42};
ll x[10];
 
int main()
{
    for(int i=1;i<=4;i++)
    {
        cout<<"? "<<i<<" "<<i+1<<endl;
        cin>>x[i];
    }
    do{
        bool flag=1;
        for(int i=1;i<=4;i++) if(a[i-1]*a[i]!=x[i]) flag=0;
        if(flag){
            cout<<"! ";
            for(int i=0;i<6;i++) cout<<a[i]<<" ";
            cout<<endl;
            break;
        }
    }while(next_permutation(a,a+6));
 
    return 0;
}

思路2:这个是比赛的时候我的做法,由12 13 14 15的乘积求出最大公约数,然后没选到的就是第六个数字,当然这个题我没写出来,结束后dy指出要特判15跟23,因为剩下4个数都是偶数,会导致求出来的最大公约数是30和46,所以要特判一下,代码中注释处。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
 
const int manx=1e5+5;
map<int,ll>vis;
ll a[6]={4,8,15,16,23,42},b[10];
char s[manx];
 
int main()
{
    ll index=0;
    int x1,x2,x3,x4,x;
 
    cout<<"? 1 2"<<endl;
    fflush(stdout);
    cin>>x1;
 
    cout<<"? 1 3"<<endl;
    fflush(stdout);
    cin>>x2;
    x=__gcd(x1,x2);
 
    cout<<"? 1 4"<<endl;
    fflush(stdout);
    cin>>x3;
    x=__gcd(x,x3);
 
    cout<<"? 1 5"<<endl;
    fflush(stdout);
    cin>>x4;
    x=__gcd(x,x4);
 
    if(x==46||x==30) x/=2;  //特判 加这一句 即可AC
 
    x1/=x,x2/=x,x3/=x,x4/=x;
    vis[x1]=1,vis[x2]=1,vis[x3]=1,vis[x4]=1,vis[x]=1;
    b[++index]=x;
    b[++index]=x1;
    b[++index]=x2;
    b[++index]=x3;
    b[++index]=x4;
 
    for(int i=0;i<6;i++)
        if(!vis[a[i]])
        {
             b[++index]=a[i];
             vis[a[i]]=1;
        }
 
    cout<<"! ";
    for(int i=1;i<=6;i++)
        cout<<b[i]<<" ";
    cout<<endl;
    return 0;
}

C. News Distribution

思路:并查集模板题,求同一个集合中的元素个数。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }

const int manx=5e5+5;
ll a[manx],b[manx];

int find(int x)
{
    if(a[x]==x) return x;
    else return a[x]=find(a[x]);
}

int main()
{
    ll n=read(),m=read();
    for(int i=0;i<=n;i++) a[i]=i;
    while(m--)
    {
        ll x=read(),u,v;
        if(x>0) u=read();
        for(int i=1;i<x;i++)
        {
            v=read();
            ll uu=find(u),vv=find(v);
            if(uu==vv) continue;
            a[uu]=vv;
        }
    }
    for(int i=1;i<=n;i++)
        b[find(i)]++; 
    for(int i=1;i<=n;i++)
        cout<<b[find(i)]<<" ";
    return 0;
}

D. Bicolored RBS

思路:这里我是用栈模拟,左括号进栈,右括号出栈,然后对2取余染色,这样交叉染色可以保证括号层数最小化。

#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
   ll s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
   return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
void put3(){ puts("-1"); }
 
const int manx=2e5+5;
ll a[manx];
 
int main()
{
    ll p=read(),index=0;
    stack<char>q;
    string s;
    cin>>s;
    for(int i=0;i<s.size();i++)
    {
        if(s[i]=='(') q.push(s[i]),a[++index]=q.size()&1;
        else if(s[i]==')') a[++index]=q.size()&1,q.pop();
    }
    for(int i=1;i<=index;i++)
        cout<<a[i];
    return 0;
}
发布了50 篇原创文章 · 获赞 15 · 访问量 4242

猜你喜欢

转载自blog.csdn.net/JiangHxin/article/details/103199235