首页 > 其他分享 >[挑战记录]猪国杀

[挑战记录]猪国杀

时间:2022-09-24 19:55:30浏览次数:63  
标签:猪国 20 函数 17 记录 int 挑战 09 19

觉得没有做过猪国杀的人生是不完整的!
于是决定开肝(

2022-09-22 18:45

吃着葡萄欣赏“人走机子开”
开始答题

19:29

看错一次题目(必须从左边开始摸牌)

19:54

又看错一次题目(类反猪和反猪是不同的)

20:03

拉 \(\color{black}{C}\color{red}{reator\_157}\) 大佬入坑

20:09

初步完成 \(K\) 函数构建

20:17

基本完成 \(P\) 函数,以及完善了 \(K\) 函数

20:41

完成 \(F\) 函数,顺便写了不知道有没有用的 \(passive\_kill\)

21:06

\(\color{black}{C}\color{red}{reator\_157}\) 大佬弃坑力(悲

21:38

将先前的函数全部修正,加入死人 \(victim\) 函数和判断胜利 \(victory\) 函数

今日码量: \(158\) 行

09-23

早上跑操加圈(悲)

06:43

完成 \(N\) 函数,\(W\) 函数

06:52

发现大锅需要补(类反猪不会被忠猪攻击)

08:27

开始施工主函数 \(play\)

09:50

交了第一次,TLE0

10:30

发现错误:猪的类型判断出错
反 猪 护 主 猪

11:08

发现一个巨大的锅,交了两次 \(0\)
主要问题在于无限摸牌 \(\cdots\)

14:08

查明主要问题:摸牌的时候上限写成了 \(n\)
\(10\) 分!

14:28

破 \(300\) 行

14:52

完成了一些辅助函数,完善 \(play\) 函数

15:27

决斗函数好像伪了,决斗攻击距离不为 \(1\)
开始大修

16:23

\(15\) 分!

16:51

\(20\) 分!

17:18

眼瞎了,没看见“如果有机会向主猪表敌意”
然后一只反猪就在主公空城 \(+\) 一点血的情况下对着满杀的忠臣用了决斗
乐死了

17:25

\(25\) 分力!

17:38

\(30\) 分!

17:53

发现链表哪里挂了,第二个子任务完成
\(35\) 分!
同时代码达到了 \(10.3K\)
晚上打 \(CF\)

今日码量:\(348\) 行

09-24

上午改题

15:00

开始调题,写 \(J\) 函数

15:46

\(40\) 分!

16:32

《关于一只忠猪出了万箭齐发打了主公这件事》
《关于这只忠猪已经跳忠了这件事》
《关于另外一只忠猪用无懈帮主公挡了,跳忠这件事》
《关于出万箭齐发的忠猪对用无懈的忠猪甩了一张决斗这件事》
好耶

16:36

《关于反猪帮主猪出了张无懈可击这件事》

17:08

原来当前出完牌后可以直接无懈自己,我大意了啊

17:10

\(55\) 分!!!

18:45

吃完晚饭回来写
发现两重循环只跳了一层,我是 \(\operatorname{SB}\)

19:04

\(65\) 分了

19:13

《关于主猪把忠猪给自己的无懈可击无懈掉了这档子事》

19:16

\(90\) 分!!!

19:21

为啥我给死人用了无懈可击?

19:26

\(95\) 分,只差一步!

19:30

\(\mathfrak{AC}\)

385行,12.05KB,100分
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
#define WR WinterRain
#define int long long
using namespace std;
const int WR=10010;
struct Pig{
    int opt;//0:主 1:忠 2:反
    int pos;//目前状态,true表示忠猪
    bool dead,equip,kill;
    int nxt;
    int HP,l,r;
    char card[WR];
    bool vis[WR];
}pig[11];
char card[WR];
int n,m;
int l,cntf;
int read(){
    int s=0,w=1;
    char ch=getchar();
    while(ch>'9'||ch<'0'){
        if(ch=='-') w=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        s=(s<<3)+(s<<1)+ch-'0';
        ch=getchar();
    }
    return s*w;
}
void getcard(int id){
    if(l!=m) l++;
    pig[id].card[++pig[id].r]=card[l];
    //cout<<"Pig "<<id<<" get card "<<card[l]<<",l="<<pig[id].l<<",r="<<pig[id].r<<endl;
}
void victory(int opt){
    if(opt) printf("FP\n");
    else printf("MP\n");
    for(int i=1;i<=n;i++){
        if(pig[i].dead) printf("DEAD\n");
        else{
            for(int j=pig[i].l;j<=pig[i].r;j++){
                if(!pig[i].vis[j]) printf("%c ",pig[i].card[j]);
            }
            printf("\n");
        }
    }
}
bool victim(int frm,int body){
    //cout<<body<<" DEAD"<<endl;
    if(pig[body].opt==2){
        cntf--;
        if(!cntf){
            victory(0);
            return true;
        }
        getcard(frm);getcard(frm);getcard(frm);
    }else if(pig[body].opt==1&&pig[frm].opt==0){
        for(int i=pig[frm].l;i<=pig[frm].r;i++) pig[frm].vis[i]=true;
        pig[frm].equip=false;
    }else if(pig[body].opt==0){
        victory(1);
        return true;
    }
    return false;
}
bool flawless(int frm,int id){
    if(pig[id].pos==-1) return false;
    bool flag=false,vis=true;
    //cout<<id<<" flawlessing..."<<endl;
    while(vis){
        vis=false;
        int pos=frm;
        do{
            if(((pig[id].pos==pig[pos].opt)||(pig[id].pos==0&&pig[pos].opt==1)
                ||(pig[id].pos==1&&pig[pos].opt==0))^flag){
                for(int i=pig[pos].l;i<=pig[pos].r;i++){
                    if(pig[pos].card[i]=='J'&&(!pig[pos].vis[i])){
                        //cout<<pos<<" flawlessed"<<endl;
                        if(pig[pos].pos==-1){
                            if(flag^(pig[id].pos==2)) pig[pos].pos=2;
                            else pig[pos].pos=1;
                        }
                        pig[pos].vis[i]=true;
                        flag^=1;vis=true;
                        while(pig[pos].vis[pig[pos].l]) pig[pos].l++;
                        break;
                    }
                }
            }
            while(pig[pig[pos].nxt].dead) pig[pos].nxt=pig[pig[pos].nxt].nxt;
            pos=pig[pos].nxt;
            if(pos==frm) break;
        }while(pos!=frm);
    }
    //cout<<(flag?"Success":"Failed")<<endl;
    return flag;
}
int peach(int id){
    //cout<<"Peached "<<id<<endl;
    int heal=0;
    for(int i=pig[id].l;i<=pig[id].r;i++){
        if((!pig[id].vis[i])&&pig[id].card[i]=='P'){
            heal++;pig[id].vis[i]=true;
        }
        if(heal) break;
    }
    while(pig[id].vis[pig[id].l]) pig[id].l++;
    return heal;
}
int save(int frm,int to){
    if(peach(to)==0){
        pig[to].dead=true;
        if(victim(frm,to)) return -1;
        else return 1;
    }else pig[to].HP=1;
    //cout<<to<<" saved itself"<<endl;
    return 0;
}
int kill(int frm,int to){//返回0表示被闪掉,1表示掉了血没死,2表示杀死了,-1表示结束了
    //cout<<frm<<" killing "<<to<<endl;
    if(pig[frm].pos!=0){
        if(pig[to].pos==2) pig[frm].pos=1;
        else if(pig[to].pos==0||pig[to].pos==1) pig[frm].pos=2;
    }
    for(int i=pig[to].l;i<=pig[to].r;i++){
        if((!pig[to].vis[i])&&pig[to].card[i]=='D'){
            pig[to].vis[i]=true;
            //cout<<"...failed\n";
            return 0;
        }
    }
    pig[to].HP--;
    if(!pig[to].HP){
        int opt=save(frm,to);
        if(opt==-1) return -1;
    }
    while(pig[to].vis[pig[to].l]) pig[to].l++;
    if(pig[to].HP) return 1;
    else return 2;
}
int arrow_kill(int frm,int to){//返回0表示被闪掉,1表示掉了血没死,2表示杀死了,-1表示结束了
    //cout<<frm<<" arrow_killing "<<to<<endl;
    for(int i=pig[to].l;i<=pig[to].r;i++){
        if((!pig[to].vis[i])&&pig[to].card[i]=='D'){
            pig[to].vis[i]=true;
            //cout<<"...failed\n";
            return 0;
        }
    }
    pig[to].HP--;
    if(!pig[to].HP){
        int opt=save(frm,to);
        if(opt==-1) return -1;
    }
    while(pig[to].vis[pig[to].l]) pig[to].l++;
    if(pig[to].HP) return 1;
    else return 2;
}
bool execute_kill(int pos){
    pig[pos].kill=true;
    int res=kill(pos,pig[pos].nxt);
    if(res==-1) return false;
    else if(res==2) pig[pos].nxt=pig[pig[pos].nxt].nxt;
    return true;
}
bool passive_kill(int id){
    for(int i=pig[id].l;i<=pig[id].r;i++){
        if((!pig[id].vis[i])&&pig[id].card[i]=='K'){
            pig[id].vis[i]=true;
            while(pig[id].vis[pig[id].l]) pig[id].l++;
            return true;
        }
    }
    while(pig[id].vis[pig[id].l]) pig[id].l++;
    return false;
}
int duel(int frm,int to){
    //cout<<frm<<" dueling "<<to<<endl;
    if(pig[frm].pos!=0){
        if(pig[to].pos==2) pig[frm].pos=1;
        else if(pig[to].pos==0||pig[to].pos==1) pig[frm].pos=2;
        //cout<<"Pig "<<frm<<" is "<<pig[frm].pos<<endl;
    }
    if(flawless(frm,to)) return 0;
    if(pig[frm].opt==0&&pig[to].opt==1){
        pig[to].HP--;
        if(!pig[to].HP) return save(frm,to);
        else return 0;
    }
    while(1==1){
        if(!passive_kill(to)){
            //cout<<to<<" failed"<<endl;
            pig[to].HP--;
            if(!pig[to].HP) return save(frm,to);
            else return 0;
        }
        if(!passive_kill(frm)){
            //cout<<frm<<" failed"<<endl;
            pig[frm].HP--;
            if(!pig[frm].HP) return save(to,frm)*2;
            else return 0;
        }
    }
}
int execute_duel(int pos,int to){
    int res=duel(pos,to);
    if(res<0) return 0;
    else if(!res) return 1;
    else if(res==1){
        //cout<<to<<"Dead"<<endl;
        int tmp=pig[pos].nxt;
        while(pig[tmp].nxt!=to) tmp=pig[tmp].nxt;
        pig[tmp].nxt=pig[to].nxt;
        return 2;
    }else{
        //cout<<pos<<"Dead"<<endl;
        int tmp=pig[to].nxt;
        while(pig[tmp].nxt!=pos) tmp=pig[tmp].nxt;
        pig[tmp].nxt=pig[pos].nxt;
        return 2;
    }
}
int invade(int id){
    for(int i=pig[id].nxt;i!=id;i=pig[i].nxt){
        if(pig[id].dead) continue;
        if(flawless(id,i)) continue;
        if(!passive_kill(i)){
            pig[i].HP--;
            //cout<<i<<"'s HP="<<pig[i].HP<<endl;
            if(pig[i].pos==0&&pig[id].pos==-1) pig[id].pos=3;
            if(!pig[i].HP&&save(id,i)==-1) return -1;
        }
    }
    return 0;
}
int arrow(int id){
    for(int i=pig[id].nxt;i!=id;i=pig[i].nxt){
        if(pig[id].dead) continue;
        if(flawless(id,i)) continue;
        int res=arrow_kill(id,i);
        if(res==-1) return -1;
        else if(res==1){
            if(pig[i].pos==0&&pig[id].pos==-1) pig[id].pos=3;
        }
    }
    return 0;
}
void crossbow(int id){
    pig[id].equip=true;
}
void play(){
    int pos=1;
    while(1==1){
        getcard(pos),getcard(pos);
        pig[pos].kill=false;
        bool opt=true;
        while(opt){
            if(pig[pos].dead) break;
            opt=false;
            for(int i=pig[pos].l;i<=pig[pos].r;i++){
                //cout<<"Pig "<<pos<<"'s card "<<i<<" is "<<pig[pos].card[i]<<",vis is "<<pig[pos].vis[i]<<endl;
                if(pig[pos].card[i]=='P'&&pig[pos].HP<4&&(!pig[pos].vis[i])){
                    //cout<<"Pig "<<pos<<" use peach,HP="<<pig[pos].HP+1<<endl;
                    peach(pos);pig[pos].HP++;
                    opt=true;break;
                }
                if(pig[pos].card[i]=='N'&&(!pig[pos].vis[i])){
                    //cout<<"Pig "<<pos<<" used SouthPig_Invade"<<endl;
                    opt=true;
                    pig[pos].vis[i]=true;
                    int res=invade(pos);
                    if(res==-1) return;
                    else break;
                }
                if(pig[pos].card[i]=='W'&&(!pig[pos].vis[i])){
                    //cout<<"Pig "<<pos<<" used Arrays_Shoot"<<endl;
                    opt=true;
                    pig[pos].vis[i]=true;
                    int res=arrow(pos);
                    if(res==-1) return;
                    else break;
                }
                if(pig[pos].card[i]=='Z'&&(!pig[pos].vis[i])){
                    //cout<<"Pig "<<pos<<" equipped crossbow"<<endl;
                    opt=true;
                    pig[pos].vis[i]=true;
                    crossbow(pos);
                    break;
                }
                if(pig[pos].card[i]=='F'&&(!pig[pos].vis[i])){
                    if(pig[pos].opt==2){
                        opt=true;pig[pos].vis[i]=true;
                        if(execute_duel(pos,1)) break;
                        else return;
                    }else if(pig[pos].opt==1){
                        bool tmp=false;
                        for(int j=pig[pos].nxt;j!=pos;j=pig[j].nxt){
                            if(pig[j].pos==2){
                                opt=true;pig[pos].vis[i]=true;
                                if(execute_duel(pos,j)){
                                    tmp=true;break;
                                }
                                else return;
                            }
                        }
                        if(tmp) break;
                    }else{
                        bool tmp=false;
                        for(int j=pig[pos].nxt;j!=pos;j=pig[j].nxt){
                            if(pig[pig[pos].nxt].pos==2||pig[pig[pos].nxt].pos==3){
                                opt=true;pig[pos].vis[i]=true;
                                if(execute_duel(pos,j)){
                                    tmp=true;break;
                                }
                                else return;
                            }
                        }
                        if(tmp) break;
                    }
                }
                if(pig[pos].card[i]=='K'&&(!pig[pos].vis[i])&&((!pig[pos].kill)||pig[pos].equip)){                    if(pig[pos].kill&&(!pig[pos].equip)) continue;
                    if(pig[pos].opt==2){
                        if(pig[pig[pos].nxt].pos==0||pig[pig[pos].nxt].pos==1){
                            opt=true;pig[pos].vis[i]=true;
                            if(execute_kill(pos)) break;
                            else return;
                        }
                    }else if(pig[pos].opt==1){
                        if(pig[pig[pos].nxt].pos==2){
                            opt=true;pig[pos].vis[i]=true;
                            if(execute_kill(pos)) break;
                            else return;
                        }
                    }else if(pig[pig[pos].nxt].pos==2||pig[pig[pos].nxt].pos==3){
                        opt=true;pig[pos].vis[i]=true;
                        if(execute_kill(pos)) break;
                        else return;
                    }
                }
            }
            while(pig[pos].vis[pig[pos].l]) pig[pos].l++;
            while(pig[pig[pos].nxt].dead) pig[pos].nxt=pig[pig[pos].nxt].nxt;
        }
        while(pig[pos].vis[pig[pos].l]) pig[pos].l++;
        pos=pig[pos].nxt;
        // for(int i=1;i<=n;i++){
        //     //cout<<i<<"'s role is "<<pig[i].opt<<",now is "<<pig[i].pos<<",HP is "<<pig[i].HP<<endl;
        //     for(int j=pig[i].l;j<=pig[i].r;j++){
        //         if(!pig[i].vis[j]) //cout<<pig[i].card[j]<<" ";
        //     }
        //     //cout<<endl;
        // }
        // //cout<<endl;
    }
}
signed main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
        char str[WR];
        scanf("%s",str+1);
        pig[i].HP=4;
        pig[i].pos=-1;
        pig[i].nxt=i%n+1;
        pig[i].l=1;pig[i].r=4;
        if(str[1]=='M') pig[i].opt=0;
        else if(str[1]=='F') pig[i].opt=2,cntf++;
        else pig[i].opt=1;
        for(int j=1;j<=4;j++){
            scanf("%s",str+1);
            pig[i].card[j]=str[1];
        }
    }
    pig[1].pos=0;
    for(int i=1;i<=m;i++){
        char str[WR];
        scanf("%s",str+1);
        card[i]=str[1];
    }
    play();
    return 0;
}

用时长达将近3天,果然我是废物/kk

image
image
image
image

标签:猪国,20,函数,17,记录,int,挑战,09,19
From: https://www.cnblogs.com/WintersRain/p/16720724.html

相关文章

  • CodeForces 比赛记录
    带星号的表示vp。\(*\)CFRound601Div.1做出A和B1。B2.SendBoxestoAlice(HardVersion)考虑\(a\)的前缀和数列\(S\),在\(a\)中移动一个数,相当于在\(S......
  • 装机记录
    2022年9月想自己组装台主机,说搞就搞,过程中有一些坑,也有些收获个人纪录下。配置清单:机箱:爱国者A15122.55元主板:B660M-E(主板cpu套装1919.55元)CPU:12400F内存:金士顿......
  • [Jetpack Compose] 记录一下实现状态栏导航栏透明、应用界面可覆盖两栏、深色浅色模式
    valcolorScheme=when{dynamicColor&&Build.VERSION.SDK_INT>=Build.VERSION_CODES.S->{valcontext=LocalContext.currentif(darkThe......
  • 并发学习记录13:不可变
    问题的提出日期转换的问题在多线程的环境下做日期转换很可能出现线程安全问题:代码:@Slf4j(topic="ch.UnchangeTest01")publicclassUnchangeTest01{publicst......
  • Docker的使用记录
    开始这是第一个尝试在Leanote上面编写文章,我觉得最重要的事情就是能够保证md文件是能够移植的,否则如果这个软件不靠谱的话,我还能把文章移动到别的地方去。所以先写一篇文......
  • ffmpeg 使用记录
    这周周末尝试把我硬盘上面的视频文件压缩了一下,但是效果并不理想。其中主要有两个原因,视频本来就是h264的编码,再重新编码也没啥用,因为限制大小的主要是码率ffmpegGPU加......
  • pyzed调用记录
    22.9.22Linux下的.so与Windows下的.pyd都是Python的动态链接库。与之相应的,需要调用dll实现功能。忽然明白了一些报了可以理解的原因zed的.dll还在其SDK的文件夹......
  • 牛客挑战赛63
    圣遗物分析:发现除了第一个位置以外每个位置都有两种选择#include<bits/stdc++.h>usingnamespacestd;constintmod=998244353;intn,fac=1;intPow(i......
  • 2022 9/23周赛丙组记录
    训练过程分析:这次比赛四道题,第一道我花了23分钟,错一次,编译错误。第二道题,我提交了两次,第一次答案错误。第三题我看不懂题目。第四题时间超限,只对了9%。两小时得了209......
  • 【问题记录】Ant Design的Select标签检验不通过不生成tag
    问题:tags模式下如何检验输入数据,如果检验不通过不生成tag解决办法:在onChange事件中检验即可。tags模式<Selectmode="tags"placeholder="Pleaseselect"......