【浮*光】【Codeforces Round #487 (Div. 2)】解题报告

A. A Blend of Springtime

#include <bits/stdc++.h>
using namespace std;

/*【A. A Blend of Springtime】
一排连续的细胞,其中每一个细胞都含有琥珀色或淡黄色或金丝雀黄色的花,或者无色。
花枯萎时,它会从原属细胞中消失,并且在两个相邻的细胞中(或者在花园外)散布其颜色的花瓣。
如果花瓣落在特定细胞之外,它们就会变得{不可见}。请注意,花可以以任意顺序枯萎。
确定是否有可能在某些(可能没有或全部)花朵脱落花瓣之后,至少其中一个细胞{含有所有三种颜色}。
如果可能所有三种颜色出现在某个单元格中,则输出“Yes”,否则输出“No”。 */

//【分析】三种不同颜色的花相连即可。即判断s[i],s[i-1],s[i+1]不相等且都等于‘.’。 

int main(){  
    string s; cin>>s;  
    int flag=0;  
    for(int i=1;i<s.size()-1;i++) 
        if(s[i]!='.')
            if(s[i-1]!=s[i]&&s[i+1]!=s[i]&&s[i+1]!=s[i-1]
                &&s[i+1]!='.'&&s[i-1]!='.')
            {   flag=1; break;   }  
    if(flag)cout<<"Yes"<<endl;  
    else cout<<"No"<<endl;  
    return 0;  
}  

B. A Tide of Riverscape

#include <bits/stdc++.h>
using namespace std;

/*【B. A Tide of Riverscape】
字符'0','1'和'.'的字符串,其中'0'表示低潮,'1'表示高潮,'.'表示未知(高或低)。
在确定每个'.'是0或1后是否有可能让给定的整数p不是结果字符串的周期。
如果p可能不是结果字符串的一个周期,则输出任何一个这样的字符串;否则输出“No”。 */

//【分析】遍历字符串,每一次判断和相隔p的字符是否相等。
//如果不相等判断是否有一个为‘.’,将‘.’改成与前p位字符相反的‘0’或‘1’。

char s[10050];  
int main(){  
    int n,p; cin>>n>>p;  
    scanf("%s",s); bool flag=false;  
    for(int i=0;i<n-p;i++){ //周期只用判断到n-p
        if((s[i]=='0'||s[i]=='1')&&s[i+p]=='.'){  
            if(s[i]=='1') s[i+p]='0';  
            else s[i+p]='1';  
            flag=true; break; //一定满足
        }  
        else if((s[i+p]=='0'||s[i+p]=='1')&&s[i]=='.'){  
            if(s[i+p]=='1') s[i]='0';  
            else s[i]='1';  
            flag=true; break;  //反向填入,也一定满足 
        }  
        else if(s[i]=='.'&&s[i+p]=='.'){  
            flag=true; s[i]='1'; s[i+p]='0'; break;  
        }  
        else if(s[i]!=s[i+p]){  
            flag=true; break;  
        } 
    }  
    if(!flag) cout<<"No"<<endl;  
    else{ 
        for(int i=0;i<n;i++)
            if(s[i]=='.') s[i]='1'; //随便填满   
        cout<<s<<endl;  
    }  
    return 0;  
}

C. A Mist of Florescence

#include <bits/stdc++.h>
using namespace std;

/*【C. A Mist of Florescence】
构造一个n*m的图,使得’A’,’B’,’C’,’D’的联通块个数分别为a,b,c,d。
n,m<=50,1<=a,b,c,d<=100  */

/* 分析》m可直接取到最大,因为多余的块可以有同一种字符填补,不会影响结果。
可以用B来帮助A构造,用1个B的联通块就可以帮助A构造。
BBBBBBBBBBBBBBBBBBBBBBBBBBBB
ABABABABABABABABABABABABABAB
BBBBBBBBBBBBBBBBBBBBBBBBBBBB
类似上图完成A的构造,之后用C帮助B,D帮助C;而D帮助C时,注意让C留出一块来帮助D。
DDDDDDDDDDDDDDDDDDDDDDDDDD
CDCDCDCDCDCDCDCDCDCDCDCDCD
CDDDDDDDDDDDDDDDDDDDDDDDDD
CCCCCCCCCCCCCCCCCCCCCCCCCC
DCDCDCDCDCDCDCDCDCDCDCDCDC
CCCCCCCCCCCCCCCCCCCCCCCCCC
这样就能保证C联通块个数不变的情况下帮助D构造成功。*/

char pic[55][55];
int main(){
    int a,b,c,d; cin>>a>>b>>c>>d;
    int pos=0;//记录当前行
    while(a){
        if(a>=25){
            for(int i=0;i<50;i+=2) pic[pos][i]='A';
            for(int i=1;i<50;i+=2) pic[pos][i]='B';
            a-=25; pos++;
            for(int i=0;i<50;i++) pic[pos][i]='B';
            pos++;
        }
        else{
            for(int i=0;i<50;i++)   pic[pos][i]='B';
            for(int i=0;i<a*2;i+=2) pic[pos][i]='A';
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='B';
            pos++; break;
        }
    }
    for(int i=0;i<50;i++) pic[pos][i]='C';
    pos++; b--;
    while(b){
        if(b>25){
            for(int i=0;i<50;i+=2) pic[pos][i]='B';
            for(int i=1;i<50;i+=2) pic[pos][i]='C';
            b-=25; pos++;
            for(int i=0;i<50;i++) pic[pos][i]='C';
            pos++;
        }
        else{
            for(int i=0;i<50;i++)   pic[pos][i]='C';
            for(int i=0;i<b*2;i+=2) pic[pos][i]='B';
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='C';
            pos++; break;
        }
    }
    c--;
    for(int i=0;i<50;i++) pic[pos][i]='D';
    if(c==0) pic[pos][0]='C';
    pos++;
    while(c){
        if(c>25){
            for(int i=0;i<50;i+=2) pic[pos][i]='C';
            for(int i=1;i<50;i+=2) pic[pos][i]='D';
            c-=25; pos++;
            for(int i=0;i<50;i++) pic[pos][i]='D';
            pos++;
        }
        else{
            for(int i=0;i<50;i++)   pic[pos][i]='D';
            for(int i=0;i<c*2;i+=2) pic[pos][i]='C';
            pos++; pic[pos][0]='C';
            for(int i=1;i<50;i++) pic[pos][i]='D';
            pos++; break;
        }
    }
    for(int i=0;i<50;i++) pic[pos][i]='C';
    pos++; d--;
    while(d){
        if(d>25){
            for(int i=0;i<50;i+=2) pic[pos][i]='D';
            for(int i=1;i<50;i+=2) pic[pos][i]='C';
            d-=25; pos++;
            for(int i=0;i<50;i++) pic[pos][i]='C';
            pos++;
        }
        else{
            for(int i=0;i<50;i++)   pic[pos][i]='C';
            for(int i=0;i<d*2;i+=2) pic[pos][i]='D';
            pos++;
            for(int i=0;i<50;i++) pic[pos][i]='C';
            pos++; break;
        }
    }
    cout<<pos<<" "<<50<<endl;
    for(int i=0;i<pos;i++){
        for(int j=0;j<50;j++) cout<<pic[i][j];
        cout<<endl;
    }
    return 0;
} //来自https://blog.csdn.net/qq_38891827/article/details/80663106 感谢dalao

好吧我并不知道连通块是什么qwq


D. A Shade of Moonlight

#include <bits/stdc++.h>
using namespace std;

/*【D. A Shade of Moonlight】
在坐标平面上有n个点。从飞机上可以选择的P点开始。如果P不属于S,则P不会被添加到S中。
然后按照给定的顺序重复几次操作(总称为移动)几次:
    选择一条直线l,使其穿过S中的至少两个位置,并通过现在所在的位置。
    如果有多条这样的线路,则选择一条等距线路移到属于S并且位于l的点之一。
    目的地在所有可能的目标中被等量选择,包括菅野目前的位置(如果它属于S)。
有q个查询,每个包含两个整数(ti,mi)。对于每个查询,你需要帮助菅野最大化停止位置
成为S中的第ti个元素的概率,然后通过适当选择P来移动mi,并输出这个最大概率。
请注意,根据规则1,P应该至少属于一条从S经过至少两个点的线。
【in】正整数n(2≤n≤200) - S中的点数。整数xi和yi- S中第i个点的坐标。
输入保证对于全部1≤i<j≤n,(xi,yi)≠(xj,yj)成立。
下一行包含正整数q(1≤q≤200) - 查询数量。
以下每行包含两个空格分隔的整数t和m(1≤ti≤n,1≤mi≤104) - 分别为目标点的索引和移动的数量。
【out】输出q行q个数,其中的第i个表示适当选择起始位置P,在mi步之后停留在第ti个点的最大概率。
如果输出中的每个数字与陪审团回答中的相应数字最多不超过10^-6,则您的答案将被视为正确。
形式上,让你的答案是a,陪审团的答案是b。如果| a-b |≤10-6,则您的答案被认为是正确的。  */

E. A Trance of Nightfall
【埋坑qwq】


                                                                                ——时间划过风的轨迹,那个少年,还在等你。

猜你喜欢

转载自blog.csdn.net/flora715/article/details/80667792