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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章