Permutation
链接:https://ac.nowcoder.com/acm/contest/5675/A
不难发现从1开始选,能选2的倍数就选2∗x%n,能选3的倍数就选3∗x%n,不能选就输出−1就行

#include<iostream>
#include<vector>
using namespace std;
const int N=1010000;
int t,p,vis[N];
int main(){
    cin>>t;
    for(int k=0;k<t;k++){
        scanf("%d",&p);
        for (int i=1;i<p;i++)    vis[i]=0;
        vis[0]=1;
        vector<int> ret;
        int x=1;
        while(1){
            vis[x]=1; 
            ret.push_back(x);
            if(!vis[x*2%p])    x=x*2%p;
            else if(!vis[x*3%p])    x=x*3%p;
            else break;
        }
        if (ret.size()!=p-1)    puts("-1");
        else    
            for(int i=0;i<ret.size();i++)    printf("%d%c",ret[i]," \n"[i==p-2]);
    }
    return 0;
}

Game
链接:https://ac.nowcoder.com/acm/contest/5675/E
这题看着比较唬人,实际上从左往右先把所有能推到左边的都尽量平分到到这一部分去,即前缀和sum平分到l,r,然后将多余的r块分给r个即可。

#include<iostream>
using namespace std;
typedef long long ll;
int n;
ll a[100005];
int main(){
    int T;
    cin>>T;
    while(T--){
        cin>>n;
        for(int i=1;i<=n;i++) cin>>a[i];
        int l=1,r=1e9,res;
        while(l<=r){
            int mid=(l+r)/2,fl=0; 
            ll now=0;
            for(int i=1;i<=n;i++){
                now+=mid-a[i];
                if(now<0) fl=1;
            }
            if(fl) l=mid+1;
            else res=mid,r=mid-1;
        }
        printf("%d\n",res);
    }
    return 0;
}

Hearthstone Battlegrounds
链接:https://ac.nowcoder.com/acm/contest/5675/D
模拟水题,被榜带偏了,😶。
题意:
现在有四种随从,这里的每种随从,如果对面没有免疫都是秒杀:

带圣盾、亡语;
带圣盾;
带亡语;
普通随从。
每种buff的效果:

圣盾效果:免疫任何攻击,免疫一次后消失;
亡语效果:随从死亡时召唤一个藤蔓;
藤蔓:只有1攻击1血量的小怪。
每回合都要发动一次攻击,游戏结束时还有随从存活就算获胜(平局不算获胜)。
幸运的是,你掌握着你的对手(?),只要有一点可能获胜就可以赢。
现在你有a[i]个i种随从,他的对手有b[i​]个i种随从,你能否获胜?
由于自己可以作为上帝,操作双方的作战策略,所以很容易分析出贪心策略。
具体内容不再赘述,归结起来就是要用3124的优先级去打对方3412的优先级。

#include<iostream>
int T,a1,a2,a3,a4,a5,b1,b2,b3,b4,b5;
void fight(){
    if(b3) --b3,++b5;
    else if(b4) --b4;
    else if(b1) --b1,++b3;
    else --b2,++b4;
}
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d%d%d%d%d%d%d",&a1,&a2,&a3,&a4,&b1,&b2,&b3,&b4);
        a5=b5=0;
        while(a1+a2+a3+a4&&b1+b2+b3+b4){
            if(a3+a4) b5=0;
            if(a5&&b1+b2){
                if(b1)    --b1,++b3;
                else    --b2,++b4;
                a5--;
            }
            if(a3)    --a3,++a5;
            else if(a1)        --a1,++a3;
            else if(a2)        --a2,++a4;
            else    --a4;
            fight();
        }
        puts(((b1+b2+b3+b4)||(!(a1+a2+a3+a4)&&a5<=b5))?"No":"Yes");
    }
}