A - 军队

问题描述

给定一个有 \(n\) 个队伍的人组成的序列,第 \(i\) 个队伍 \(i\) 有 \(s[i]\)个人组成,一个 \(l\) 到 \(r\)的子序列是合法的,当且仅当\(((∀i)(∀j)∧(i≠j)∧(l≤i,j≤r))→(gcd(s[i],s[j])=1)\),即对于该序列中任两个不相同的队伍,他们人数的最大公约数为 \(1\),并且要求该子序列的总人数大于等于 \(k\)。

且由于每个队伍能够审批携带的仪器是有限的,所以需要这个队伍\((r - l + 1)\)尽可能长,请求出这个队伍的最长长度,若不存在,请输出 \(0\)。

输入

第一行两个整数 \(n,k\) 分别表示队伍数量和人数下限

接下来一行 \(n\) 个整数,表示每个队伍的人数

输出

一行一个整数,表示队伍的最长长度,如果不存在一个这样的队伍,则输出 \(0\)

输入输出样例

样例输入

5 14
4 5 12 3 2

样例输出

2

数据范围

对于 \(10\%\)的数据 \(n≤10\)

对于另外 \(20\%\)的数据 \(n≤100\)

对于另外 \(20\%\)的数据 \(n≤2\times 1000\)

对于全部的数据 \(1≤n≤10^5, 1≤s[i]≤10^6, k≤ int\)。

题解

枚举左端点及右端点即可,还要加一些玄学优化。

\(n\)方过十万!

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#define int long long
#define gI gi
#define itn int
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout) using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
return f * x;
} int n, k, a[100003], dp[100003], sum[100003]; namespace sub1
{
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a % b);
}
bool pd(int l, int r)
{
for (int i = l; i <= r; i+=1)
{
for (int j = i + 1; j <= r; j+=1)
{
if (a[i] % 2 == 0 && a[j] % 2 == 0) return false;
if (gcd(a[i], a[j]) != 1) return false;
}
}
return true;
}
void getans()
{
itn ans = 0;
for (int i = 1; i <= n; i+=1)
{
for (int j = i + 1; j <= n; j+=1)
{
if (sum[j] - sum[i - 1] < k) continue;
if (pd(i, j)) ans = max(ans, j - i + 1);
}
}
printf("%lld\n", ans);
return;
}
} namespace sub2
{
int gcd(int a, int b)
{
if (b == 0) return a;
return gcd(b, a % b);
}
void getans()
{
int ans = 0;
for (int i = 1; i <= n; i+=1)
{
int Right;
for (Right = i; Right <= n; Right+=1) if (sum[Right] - sum[i] >= k) break;
bool fl = false;
for (int j = i; j <= Right && !fl; j+=1)
{
for (int k = j + 1; k <= Right && !fl; k+=1)
{
if (gcd(a[j], a[k]) != 1) fl = true;
}
}
if (fl) continue;
ans = max(ans, Right - i + 1);
for (++Right; Right <= n; Right+=1)
{
bool fl = false;
for (int j = i; j < Right && !fl; j+=1) if (gcd(a[j], a[Right]) != 1) fl = true;
if (fl) break;
ans = max(ans, Right - i + 1);
}
}
printf("%lld\n", ans);
}
} signed main()
{
File("tarmy");
n = gi(), k = gi();
for (int i = 1; i <= n; i+=1) a[i] = gi(), sum[i] = sum[i - 1] + a[i];
if (sum[n] < k) {puts("0"); return 0;}
if (n <= 100) {sub1::getans(); return 0;}
else {sub2::getans(); return 0;}
return 0;
}

B - 取石块儿

问题描述

小 \(L\) 和小 $T $进行取石块儿游戏,给定一个整数 \(n\) 表示石块儿总数,给定一个整数 \(k\) 表

示每次最多能拿走的石块儿数量,小 \(L\) 先手,每次能拿走 \(1\)~\(k\) 个石块儿,他们中总会有一

个人最后拿走 \(s\) 块儿石块儿,使得剩余石块儿数量为 \(0\),则最后一个拿走剩下石块儿的人获

胜,另外一个人失败。

小 \(T\) 非常聪明,小 \(L\) 绝顶(秃子(逃))聪明,请判断小 \(T\) 是否能取胜。

输入

第一行一个整数 \(T\) 表示数据组数,接下来 \(T\) 行每行两个整数 \(n\),\(k\) 意义为描述所给。

输出

对于每组数据,输出"\(YES\)"或者"\(NO\)"(不带引号),代表小 \(T\) 是否能够获胜。

输入输出样例

样例输入

2
2 1
10 4

样例输出

YES
YES

数据范围

题解

首先对于只有\(k\)个石块儿的情况, 很明显直接一次拿走就能获胜, 对于有\(k + 1\)块石块儿情况, 不论怎么拿, 总会产生少于\(k\)块石块儿的情况, 于是是必败的。

同样, 对于\((k + 1, k + k + 1]\)个石块儿的情况, 总能拿走一部分石块儿是的对手处于\(k + 1\)的必败情况, 归纳证明当\(n \% (k + 1) == 0\)的时候, 先手必胜, 反之后手必胜。

代码超短的……

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#define int unsigned long long
#define gI gi
#define itn int
#define File(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout) using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') {if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') {x = x * 10 + c - '0'; c = getchar();}
return f * x;
} int t, n, k, a, b; signed main()
{
File("tstones");
t = gi();
while (t--)
{
n = gi(), k = gi();
if (k == 1)
{
if (n & 1) puts("NO");
else puts("YES");
}
else
{
if (n % (k + 1)) puts("NO");
else puts("YES");
}
}
return 0;
}

总结

这次练习做得不是很好。

要拿的很多部分分都没有拿到。

还要继续努力啊\(QwQ\)。

NOIP做题练习(day3)的更多相关文章

  1. noip做题记录+挑战一句话题解?

    因为灵巧实在太弱辽不得不做点noip续下命QQAQQQ 2018 积木大赛/铺设道路 傻逼原题? 然后傻逼的我居然检查了半天是不是有陷阱最后花了差不多一个小时才做掉我做过的原题...真的傻逼了我:( ...

  2. NOIP做题练习(day2)

    A - Reign 题面 题解 最大子段和+\(DP\). 预处理两个数组: \(p[i]\)表示 \(i\) 之前的最大子段和. \(l[i]\)表示 \(i\) 之后的最大子段和. 最后直接输出即 ...

  3. NOIP做题练习(day1)

    A - Xenny and Alternating Tasks 题面 题解 枚举第一天是谁做,将两个答案取\(min\)即可. 代码 #include <iostream> #includ ...

  4. $NOIp$做题记录

    虽然去年做了挺多了也写了篇一句话题解了但一年过去也忘得差不多了$kk$ 所以重新来整理下$kk$ $2018(4/6$ [X]积木大赛 大概讲下$O(n)$的数学方法. 我是从分治类比来的$QwQ$. ...

  5. NOIP做题练习(day4)

    A - 同花顺 题面 题解 30分做法 爆搜即可. 60分做法 去重+贪心. 100分做法 去重+贪心后,我们要寻找一段符合条件的最长同花上升子序列 \(L\),\(n-L\) 即为所求的答案. 首先 ...

  6. NOIP做题练习(day5)

    A - 中位数图 题面 题解 先找出题意中的\(b\)所在的位置. 再以这个位置为中心,向右\(for\)一遍有多少个大于/小于该数的数 大于就\(++cs\) 小于就\(--cs\). 因为这个数是 ...

  7. NOIP初赛:完善程序做题技巧

    最近写的文章好像还很多的.那么今天我们来讨论NOIP初赛的题型--完善程序.完善程序相对是比较难的题目了.全卷100分,完善程序占了大概26分,占比非常大.如果和英语考试试卷做比较,相当于首字母填空( ...

  8. [日记&做题记录]-Noip2016提高组复赛 倒数十天

    写这篇博客的时候有点激动 为了让自己不颓 还是写写日记 存存模板 Nov.8 2016 今天早上买了两个蛋挞 吃了一个 然后就做数论(前天晚上还是想放弃数论 但是昨天被数论虐了 woc noip模拟赛 ...

  9. CodeM美团点评编程大赛复赛 做题感悟&题解

    [T1] [简要题意]   长度为N的括号序列,随机确定括号的方向:对于一个已确定的序列,每次消除相邻的左右括号(右左不行),消除后可以进一步合并和消除直到不能消为止.求剩下的括号的期望.\(N \l ...

随机推荐

  1. kali linux中mariadb加上密码

    kali自带mysql.2019.4 中带得是:MariaDB.据说跟Mysql差不多.简单用了一下发现root用户可以不要密码进入Mysql! 这极不习惯,不输入密码感觉好像少了点什么.这肯定是权限 ...

  2. 巨杉数据库SequoiaDB】巨杉Tech | SequoiaDB 分布式事务实现原理简介

    1 分布式事务背景 随着分布式数据库技术的发展越来越成熟,业内对于分布式数据库的要求也由曾经只用满足解决海量数据的存储和读取这类边缘业务向核心交易业务转变.分布式数据库如果要满足核心账务类交易需求,则 ...

  3. IO流学习之字节流(一)

    IO流(Input/Output) 简介: 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数 ...

  4. 按钮控制彩灯实验 CSU - 1770 树状数组 差分变单点修改

    #include<iostream> #include<algorithm> #include<cstring> using namespace std; ; in ...

  5. mysql日期函数及重复数据的查询

    -- 日期函数select CURRENT_DATE,CURRENT_TIME,CURRENT_TIMESTAMP,year(CURRENT_DATE),month(CURRENT_DATE);sel ...

  6. JavaScript 继承 -JavaScript高级程序设计

    oo(Object Oriented)面向对象 许多oo语言都支持两种继承方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.函数没有签名,在ecmascript中无法实现接 ...

  7. git内容补充-Git零基础快速入门-苏玲

    https://git-scm.com/book/zh/v2 git历史 集中式版本控制管理:cvs.svn 分布式版本控制管理:git 基本命令 git config --list --global ...

  8. TCL常用命令

    1.删除文件 file delete A file delete -force A 2.建立文件夹 file mkdir A file mkdir A/A 3.判断文件夹是否存在 file exist ...

  9. MongoDB地理空间(2d)索引创建与查询

    LBS(Location Based Services)定位服务,即根据用户位置查询用户附近相关信息,这一功能在很多应用上都有所使用.基于用户位置进行查询时,需要提供用户位置的经纬度.为了提高查询速度 ...

  10. Python之路Day09

    函数 将某个功能封装到一个空间中就是一个函数 减少重复代码 函数体中存放的时代码 定义函数 def len(): def 关键字 len 函数名 -- 变量名 ()格式规定 :语句结束 调用函数 函数 ...