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"); } }