test20180902 day1
试题限制均为256MB,1Sec
总分:250
试题一
谜题
首先请解以下谜题:车下的数字是什么?
正确的答案是 87 。这道题对小龙大犇来说太轻松了,于是他想加强难度来考考你:对于给定的长度 N,能否获得刚好长度为 N 的数列,使数列中的每个数经过翻转恰好是连续的数,如 N==3 时,数列 11 01 60 是合法的。数字的翻转符合以下规定:1、0、8 翻转后是其本身;6 和 9 翻转后互相转变;其他数字翻转后不合法;一位数将默认有前导零;只考虑一位或两位正整数。
【输入】puzzle.in
一行一个数字 N(N<=99)
【输出】puzzle.out
如果能,输出“YES”;否则输出“XLSB”;
【样例输入】
3
【样例输出】
YES
【数据规模】
对于 10%的数据,\(N \leq 1\);
对于 20%的数据,\(N \leq 3\);
对于 50%的数据,\(N \leq 4\);
对于 100%的数据 \(N \leq 99\);
分析
考场做法,同标解
手推或打代码爆搜发现最长为 8 9 10 11 所以<=4 输出 YES。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
int main()
{
freopen("puzzle.in","r",stdin);
freopen("puzzle.out","w",stdout);
int n;
read(n);
if(n<=4)
puts("YES");
else
puts("XLSB");
// fclose(stdin);
// fclose(stdout);
return 0;
}
试题二
选修课
温州中学开放了许多选修课,每节选修课都属于一种种类。精力旺盛的黄小龙同学想要尽可能多的参加选修课,但是他只能选择 M 种种类的课程。当然,对于他所选的种类,他会去上所有该种类的课。现在他想知道他最多能上几节选修课,以及上最多选修课的方案数。两种方案被认为不同当且仅当一种方案中存在另一种方案所没有的选修课。
【输入】course.in
第一行一个只由小写字母组成,长度为 N 的字符串。表示有 N 节选修课,以及每节选修课的种类。
第二行一个正整数 M。
【输出】course.out
输出一行,两个用空格隔开的正整数,分别表示最多选修课数量和方案数。
【样例输入 1】
abcde
1
【样例输出 1】
1 5
【样例输入 2】
ababac
2
【样例输出 2】
5 1
【数据规模】
对于 30%的数据,\(M=1\);
对于另外 30%的数据,每种种类的选修课最多只有一节;
对于 100%的数据 \(1 \leq M \leq 26,1 \leq N \leq 100000\);
分析
考场做法,同标解
优先课程数最多的种类,可改变的是已选种类中课程数最少的那一类,A=课程数最少的种类选了几种,B=与该课程数相等的种类总共有多少,方案数为\(\binom{B}{A}\) 。可以考虑高精度乘法与除法,避开的方法:考虑到最终答案最大为\(\binom{26}{13}\) 并不会超`long long ,但中间过程会。1、以素数乘积形式表示,在数组中加加减减,最后乘起来2、边乘边除。(标程用了第一种,但其中的高精度是没必要的)
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=1e5+7;
struct node
{
int v;
bool operator<(const node&rhs)const
{
return v>rhs.v;
}
}a[26];
char s[MAXN];
void write(__int128 x)
{
stack<int>S;
while(x)
{
S.push(x%10);
x/=10;
}
while(!S.empty())
{
putchar(S.top()+'0');
S.pop();
}
}
int main()
{
freopen("course.in","r",stdin);
freopen("course.out","w",stdout);
int n,m;
scanf("%s",s+1);
n=strlen(s+1);
read(m);
for(int i=1;i<=n;++i)
{
++a[s[i]-'a'].v;
}
sort(a,a+26);
int ans=0;
int i;
for(i=0;i<26&&m;++i,--m)
{
ans+=a[i].v;
}
--i;
printf("%d ",ans);
int x=1,y=1;
for(int j=i-1;j>=0;--j)
if(a[j].v==a[i].v)
++x,++y;
for(int j=i+1;j<26;++j)
if(a[j].v==a[i].v)
++y;
// cerr<<"x="<<x<<" y="<<y<<endl;
__int128 sum=1;
for(i=y-x+1;i<=y;++i)
sum*=i;
for(i=1;i<=x;++i)
sum/=i;
write(sum);
// fclose(stdin);
// fclose(stdout);
return 0;
}
试题三
质数
学校宿管有一套神奇的控制系统来控制寝室的灯的开关:
共有 N 盏灯,标号为 1 到 N,有 M 个标有不同质数的开关,开关可以控制所有标号为其标号倍数的灯,按一次开关,所有其控制的灭着的灯都点亮,所有其控制的亮着的灯将熄灭。现在,宿管可以无限的按所有开关,所有灯初始状态为熄灭,请求出最多能点亮几盏灯。
【输入】
输入有多组数据,第一行一个正整数 T 表示数据组数。
每组数据第一行两个整数 N,M。
第二行 M 个不同的质数表示开关上的标号,保证所有标号<=N。
【输出】
对于每组数据输出一行一个整数表示最多亮灯数。
【样例输入】
4
10 2
2 5
21 4
2 3 5 7
100 1
5
100 3
3 19 7
【样例输出】
5
11
20
42
【数据范围】
对于 50%的数据,\(N \leq 15\);
对于 100%的数据,\(T \leq 10,N \leq 1000\)。 所有标号不相等,\(M≤N 以内的质数总个数\)。
分析
考场50分
用\(f(i,0/1)\)表示前\(i\)个开关,其中第\(i\)个选(1)或不选(0)的最多亮灯数,\(g(i,0/1)\)用bitseet表示状态。
然而这dp不满足无后效性,所以是错的。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=1e3+7;
int a[MAXN];
int f[MAXN][2];
bitset<MAXN> g[MAXN][2],s,t;
/*
4
10 2
2 5
21 4
2 3 5 7
100 1
5
100 3
3 19 7
*/
int main()
{
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
int T;
read(T);
while(T--)
{
int n,m;
read(n);read(m);
for(int i=1;i<=m;++i)
read(a[i]);
sort(a+1,a+m+1);
for(int i=1;i<=m;++i)
{
f[i][0]=f[i-1][0],g[i][0]=g[i-1][0];
if(f[i-1][1]>f[i-1][0])
{
f[i][0]=f[i-1][1],g[i][0]=g[i-1][1];
}
s=g[i-1][0],t=g[i-1][1];
for(int j=a[i];j<=n;j+=a[i])
{
s[j-1]=s[j-1]^1;t[j-1]=t[j-1]^1;
}
int s1=0,t1=0;
for(int j=0;j<n;++j)
{
if(s[j])
++s1;
if(t[j])
++t1;
}
if(s1>t1)
{
f[i][1]=s1,g[i][1]=s;
}
else
{
f[i][1]=t1,g[i][1]=t;
}
}
printf("%d\n",max(f[m][0],f[m][1]));
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
标解
将质数根据根号 N 划分成两部分,大于根号 N 部分不会互相影响(最小公倍数大于N),小于根号 N 素数最多11 个,穷举小于根号 N 的开关的开关情况,对于每种情况贪心判断大于根号 N 部分(即判断开这个开关是否增加总点亮数)。
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<ctime>
#include<iostream>
#include<string>
#include<vector>
#include<list>
#include<deque>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include<algorithm>
#include<complex>
#pragma GCC optimize ("O0")
using namespace std;
template<class T> inline T read(T&x)
{
T data=0;
int w=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
w=-1;
ch=getchar();
}
while(isdigit(ch))
data=10*data+ch-'0',ch=getchar();
return x=data*w;
}
typedef long long ll;
const int INF=0x7fffffff;
const int MAXN=1e3+7;
int a[MAXN],k,n;
int ans;
bitset<MAXN> f;
/*
4
10 2
2 5
21 4
2 3 5 7
100 1
5
100 3
3 19 7
*/
void judge(int x)
{
bitset<MAXN> g;
g.reset();
for(int i=1;i<=k;++i)
if(x&(1<<i))
for(int j=a[i];j<=n;j+=a[i])
g[j]=g[j]^1;
int sum=0;
for(int i=1;i<=n;++i)
if(g[i])
++sum;
ans=sum,f=g;
}
int main()
{
freopen("prime.in","r",stdin);
freopen("prime.out","w",stdout);
int T;
read(T);
while(T--)
{
int m;
read(n);read(m);
for(int i=1;i<=m;++i)
read(a[i]);
sort(a+1,a+m+1);
k=0;
int t=sqrt(n);
for(int i=1;i<=m;++i)
if(a[i]<=t)
++k;
int ms=(1<<k);
int maxv=-1;
for(int i=0;i<ms;++i)
{
ans=0;
judge(i<<1);
for(int j=k+1;j<=m;++j)
{
int sum=0;
for(int t=a[j];t<=n;t+=a[j])
if(f[t])
--sum;
else
++sum;
if(sum>0)
{
for(int t=a[j];t<=n;t+=a[j])
f[t]=f[t]^1;
ans+=sum;
}
}
maxv=max(maxv,ans);
}
printf("%d\n",maxv);
// cerr<<"judge end"<<endl;
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
test20180902 day1的更多相关文章
- NOIp2016 Day1&Day2 解题报告
Day1 T1 toy 本题考查你会不会编程. //toy //by Cydiater //2016.11.19 #include <iostream> #include <cstd ...
- day1
day1.py ][][: ][: ): : ]['lock'] = 0 json.dump(userlist_message, open(userlist, 'w')) break #输错次数到3次 ...
- day1作业--登录入口
作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...
- luogu1003铺地毯[noip2011 提高组 Day1 T1]
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...
- Python学习路程day1
变量起名: 变量名如果太长,推荐使用下划线来分开,让人看得清晰明白.例:nums_of_alex_girl=19 .或者是驼峰写法,即首字母大写.例:NumOfAlexGf=18 注意:不合法的变量起 ...
- 团队项目——站立会议 DAY1
团队项目--站立会议 DAY1 团队成员介绍(5人):张靖颜.何玥.钟灵毓秀.赵莹.王梓萱 今日(2016/5/6)为站立会议的第一天,一起对团队项目进行讨论,并对每个人的 ...
- Day1 login
使用流程: 1.程序启动后,显示欢迎信息,提示用户输入用户名: 2.判断用户是否存在,不存在则提示重新输入,或者关闭程序:客户存在则提示客户输入密码: 3.判断密码是否正确,如果不正确则提示用户重新输 ...
- contesthunter CH Round #64 - MFOI杯水题欢乐赛day1 solve
http://www.contesthunter.org/contest/CH Round %2364 - MFOI杯水题欢乐赛 day1/Solve Solve CH Round #64 - MFO ...
- noip2011提高组day1+day2解题报告
Day1 T1铺地毯https://www.luogu.org/problem/show?pid=1003 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
随机推荐
- 流氓 2345.com的新动态及解决方法
安装了[电脑公司]的Win7_SP1之后, IE的主页被绑架. 症状是先转到 IE959.com,然后自动跳转到 www.2345.com 网上当然有很多例子了,可是都没有效果. 1. 更改IE设置没 ...
- py to exe —— pywin32
xu言: 最近研究python,觉得做些windows小工具还挺好玩,就研究了下py代码如何转成exe 这里用到一个工具 pywin32 https://sourceforge.net/project ...
- Confluence 6 使用 LDAP 授权连接一个内部目录概述
你可以为你的 Confluence 连接 LDAP 服务器使用使用委托认证.这个意思是 Confluence 将会设置一个内部目录,这个目录仅被用来处理 LDAP 的授权. 这个设置将会为尝试登录系统 ...
- YOLO v2 损失函数源码分析
损失函数的定义是在region_layer.c文件中,关于region层使用的参数在cfg文件的最后一个section中定义. 首先来看一看region_layer 都定义了那些属性值: layer ...
- Android 时钟(由秒转变为时分秒)
int second = 0: Handler handler = new Handler(); handler.post(runnable); Runnable runnable = new Run ...
- Linux文件与目录管理(三)
一.Linux文件内容查看 1.cat:由第一行开始显示文件内容 2.tac:从最后一行开始显示,可以看出tac是cat倒着写 3.nl:显示的时候,顺便输出行号 4.more:一页一页的显示文件内容 ...
- iOS UI-QQ聊天布局
一.Model BWMessage.h #import <Foundation/Foundation.h> typedef enum{ BWMessageMe = ,//表示自己 BWMe ...
- stimulsoft report工具—— 简单的多表连接打印报表例子
一.用报表工具打印多个表格信息(包括学生表.教师表.班级表) 1.准备打印的数据(用sqlserver) 1)班级表
- SQL Server 调优系列基础篇 - 性能调优介绍
前言 关于SQL Server调优系列是一个庞大的内容体系,非一言两语能够分析清楚,本篇先就在SQL 调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体的语句调优. 通过 ...
- 快速切题 sgu105. Div 3 数学归纳 数位+整除 难度:0
105. Div 3 time limit per test: 0.25 sec. memory limit per test: 4096 KB There is sequence 1, 12, 12 ...