Wannafly挑战赛24游记

A - 石子游戏

题目大意:

A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏。操作包含以下两种:

  1. 把石子数为奇数的一堆石子分为两堆正整数个石子;
  2. 把两堆石子数为偶数的石子合并为一堆。

若两人都按照最优策略进行操作。求若A先手,最后谁能赢得比赛。

思路:

首先最优策略中一定是将奇数拆成\(1\)和另一个偶数,然后不断将所有偶数进行合并。

因此我们可以统计非\(1\)奇数的个数\(a\)和所有非\(1\)数的个数\(b\)。由此我们可以求出拆分次数和合并次数,根据操作次数的奇偶性判断即可。

源代码:

#include<cstdio>
#include<cctype>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
int main() {
const int n=getint();
int cnt=0,tmp=0,tot=0;
for(register int i=1;i<=n;i++) {
const int x=getint();
if(x==1) continue;
cnt++;
if(x&1) tot++;
}
while(cnt>1) {
tmp+=cnt/2;
cnt=cnt/2+cnt%2;
}
puts((tmp+tot)%2?"Alice":"Bob");
return 0;
}

B - 222333

题目大意:

给定质数\(p(p\le10^7)\),一定存在\(m,n\)满足\(p|2^m3^n-1\)且\(m+n\le p\)。求数对\((m,n)\)。若存在多种,优先输出\(m+n\)最小的一种。若还有多中,优先输出\(m\)最小的一种。

思路:

\(p|2^m3^n-1\)意味着\(2^m3^n\equiv1\pmod{p}\),即\(3^m\)在模\(p\)意义下是\(2^n\)的逆元。

而\(p\le10^7\),因此我们可以先求出\(3^n\)的取值在模\(p\)意义下有多少种可能。然后枚举\(m\),判断\(2^m\)的逆元是否有对应的\(3^m\)即可。

其中\(2^m\)的逆元不需要每次重新求,直接根据\(2^{-1}\)推即可。

小优化:当\(n\ge\)目前\(n+m\)的最小值时,直接跳出循环。

时间复杂度\(\mathcal O(10p)\)。

源代码:

#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int N=1e7+1;
int n,b[N];
inline void exgcd(const int &a,const int &b,int &x,int &y) {
if(!b) {
x=1,y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline int get_inv(const int &x) {
int ret,tmp;
exgcd(x,n,ret,tmp);
return (ret%n+n)%n;
}
int main() {
while(~scanf("%d",&n)) {
const int inv=get_inv(2);
for(register int i=1,p=3;i<=n;i++) {
if(!b[p]) b[p]=i;
p=p*3%n;
}
int min=INT_MAX,x,y;
for(register int i=1,q=inv;i<=n;i++) {
if(i>=min) break;
if(b[q]) {
if(i+b[q]<min) {
min=i+b[q];
x=i;
y=b[q];
}
}
q=(int64)q*inv%n;
}
printf("%d %d\n",x,y);
std::fill(&b[1],&b[n]+1,false);
}
return 0;
}

C - 失衡天平

题目大意:

有\(n(n\le100)\)个物品,每个物品有一个价值\(v_i(v_i\le100)\)。你可以每次选取两堆物品,若这两堆物品价值总和之差\(\le m(m\le100)\)则可以将这两堆物品全部取出。问最后最多取走多少价值的物品?

思路:

首先可以证明可以将这些取走物品分成两堆,使得价值和之差仍旧小于\(m\)。

\(f[i][j][k]\)表示前\(i\)个物品,一堆价值为\(j\),一堆价值为\(k\)是否可行。使用滚动数组和bitset优化即可。

时间复杂度\(\mathcal O(\frac{n^5}{32})\)。

源代码:

#include<cstdio>
#include<cctype>
#include<bitset>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=101,M=1e4+1;
int a[N];
std::bitset<M> b[2][M];
int main() {
const int n=getint(),m=getint();
for(register int i=1;i<=n;i++) a[i]=getint();
std::sort(&a[1],&a[n]+1);
b[0][0]=true;
int sum=0;
for(register int i=1;i<=n;i++) {
const bool cur=i&1;
sum+=a[i];
for(register int j=0;j<=sum;j++) {
b[cur][j]|=b[!cur][j]<<a[i];
b[cur][j]|=b[!cur][j];
}
for(register int j=a[i];j<=sum;j++) {
b[cur][j]|=b[!cur][j-a[i]];
}
}
int ans=0;
for(register int i=0;i<=sum;i++) {
for(register int j=std::max(i-m,0);j<=std::min(i+m,sum);j++) {
if(b[n&1][i][j]) ans=std::max(ans,i+j);
}
}
printf("%d\n",ans);
return 0;
}

Wannafly挑战赛24游记的更多相关文章

  1. Wannafly挑战赛25游记

    Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...

  2. Wannafly挑战赛22游记

    Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...

  3. 【Wannafly挑战赛24】【C失衡天平】

    https://www.nowcoder.com/acm/contest/186/C 题意:有n个武器,每个武器都有一个重量 Wi,有一个天平,只要两端的重量差不大于m就能达到平衡,求在天平平衡的情况 ...

  4. Wannafly挑战赛24 B 222333

    小水题???但是时间限制异常鬼畜,跑了2min \(P | (2^m)*(3^n)-1\)的意思就是\(2^m 3^n = 1 (\text{mod }P)\) 设f[i]表示3^k=i的最小的k 然 ...

  5. Wannafly挑战赛24

    A. 石子游戏 Alice和Bob在玩游戏,他们面前有n堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏.可以进行两种操作:1. 把石子数为奇数的一堆石子分为两堆正整数个石 ...

  6. Wannafly挑战赛27

    Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...

  7. Wannafly 挑战赛 19 参考题解

    这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...

  8. Wannafly挑战赛21A

    题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...

  9. Wannafly挑战赛25C 期望操作数

    Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...

随机推荐

  1. python操作txt文件中数据教程[4]-python去掉txt文件行尾换行

    python操作txt文件中数据教程[4]-python去掉txt文件行尾换行 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文章 python操作txt文件中数据教程[1]-使用pyt ...

  2. windows10 升级1803后,远程错误提示“出现身份验证错误,要求的函数不受支持 CredSSP 加密 Oracle修正”的解决办法

    远程出现错误提示:出现身份验证错误,要求的函数不受支持 CredSSP 加密 Oracle修正 运行 gpedit.msc 本地组策略: 计算机配置>管理模板>系统>凭据分配> ...

  3. JIRA项目管理搭建

    部署JIRA 7.2.2 for Linux 转自:http://www.yfshare.vip/2017/05/09/%E9%83%A8%E7%BD%B2JIRA-7-2-2-for-Linux/ ...

  4. 「MYSQL」MYSQL中的int(11)到底代表什么意思?

    一.前言 在工作中经常要与mysql打交道,但是对mysql的各个字段类型一直都是一知半解,因此写本文总结记录一番. 二.简介 对于int类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用 ...

  5. HDU 4627 The Unsolvable Problem 杭电多校联赛第三场1009 数学题

    题意描述:给出一个n,要求在所有满足n = a+b的a和b里面求a和b的最小公倍数最大的两个数的最小公倍数. 解题报告:比赛的时候看到这个题的第一反应就是寻找这两个数一定是在a和b比较接近的地方找,这 ...

  6. cordova app 监听物理返回键

    物理返回键指的是手机系统自带的返回按钮,通过cordova监听返回按钮操作,可以禁止某些页面的返回操作,以及实现点击两次返回按钮退出应用. var pageUrl = window.location. ...

  7. 搜索引擎ElasticSearchV5.4.2系列三之ES使用

    相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x- ...

  8. 三、vue脚手架工具vue-cli的使用

    1.vue-cli构建 vue-cli工具构建:https://blog.csdn.net/u013182762/article/details/53021374 npm的镜像替换成淘宝 2.项目运行 ...

  9. 环境变量GOPATH使用试验

    Intel Core i5-8250U,Windows 10家庭中文版,Visual Studio Code 1.26.1 中午的时候,自己把环境变量GOBIN给清空了.刚刚继续工作时发生了异常:使用 ...

  10. ajax发送多个跨域请求回调不混乱

    var count = 0; var codes = ""; function refreshCache(urls){ try { var url = urls.split(&qu ...