Wannafly挑战赛24游记
Wannafly挑战赛24游记
A - 石子游戏
题目大意:
A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏。操作包含以下两种:
- 把石子数为奇数的一堆石子分为两堆正整数个石子;
- 把两堆石子数为偶数的石子合并为一堆。
若两人都按照最优策略进行操作。求若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游记的更多相关文章
- Wannafly挑战赛25游记
Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...
- Wannafly挑战赛22游记
Wannafly挑战赛22游记 幸运的人都是相似的,不幸的人各有各的不幸. --题记 A-计数器 题目大意: 有一个计数器,计数器的初始值为\(0\),每次操作你可以把计数器的值加上\(a_1,a_2 ...
- 【Wannafly挑战赛24】【C失衡天平】
https://www.nowcoder.com/acm/contest/186/C 题意:有n个武器,每个武器都有一个重量 Wi,有一个天平,只要两端的重量差不大于m就能达到平衡,求在天平平衡的情况 ...
- 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 然 ...
- Wannafly挑战赛24
A. 石子游戏 Alice和Bob在玩游戏,他们面前有n堆石子,对于这些石子他们可以轮流进行一些操作,不能进行下去的人则输掉这局游戏.可以进行两种操作:1. 把石子数为奇数的一堆石子分为两堆正整数个石 ...
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- Wannafly挑战赛21A
题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...
- Wannafly挑战赛25C 期望操作数
Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...
随机推荐
- python操作txt文件中数据教程[4]-python去掉txt文件行尾换行
python操作txt文件中数据教程[4]-python去掉txt文件行尾换行 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文章 python操作txt文件中数据教程[1]-使用pyt ...
- windows10 升级1803后,远程错误提示“出现身份验证错误,要求的函数不受支持 CredSSP 加密 Oracle修正”的解决办法
远程出现错误提示:出现身份验证错误,要求的函数不受支持 CredSSP 加密 Oracle修正 运行 gpedit.msc 本地组策略: 计算机配置>管理模板>系统>凭据分配> ...
- 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/ ...
- 「MYSQL」MYSQL中的int(11)到底代表什么意思?
一.前言 在工作中经常要与mysql打交道,但是对mysql的各个字段类型一直都是一知半解,因此写本文总结记录一番. 二.简介 对于int类型的一些基础知识其实上图已经说的很明白了,在这里想讨论下常用 ...
- HDU 4627 The Unsolvable Problem 杭电多校联赛第三场1009 数学题
题意描述:给出一个n,要求在所有满足n = a+b的a和b里面求a和b的最小公倍数最大的两个数的最小公倍数. 解题报告:比赛的时候看到这个题的第一反应就是寻找这两个数一定是在a和b比较接近的地方找,这 ...
- cordova app 监听物理返回键
物理返回键指的是手机系统自带的返回按钮,通过cordova监听返回按钮操作,可以禁止某些页面的返回操作,以及实现点击两次返回按钮退出应用. var pageUrl = window.location. ...
- 搜索引擎ElasticSearchV5.4.2系列三之ES使用
相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x- ...
- 三、vue脚手架工具vue-cli的使用
1.vue-cli构建 vue-cli工具构建:https://blog.csdn.net/u013182762/article/details/53021374 npm的镜像替换成淘宝 2.项目运行 ...
- 环境变量GOPATH使用试验
Intel Core i5-8250U,Windows 10家庭中文版,Visual Studio Code 1.26.1 中午的时候,自己把环境变量GOBIN给清空了.刚刚继续工作时发生了异常:使用 ...
- ajax发送多个跨域请求回调不混乱
var count = 0; var codes = ""; function refreshCache(urls){ try { var url = urls.split(&qu ...