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 [题目分析] 全部读入以后从最后一个往前找,找到一个矩形的范围覆盖了这个点,那这个矩形就是最 ...
随机推荐
- [Java学习] Java方法重载
在Java中,同一个类中的多个方法可以有相同的名字,只要它们的参数列表不同就可以,这被称为方法重载(method overloading). 参数列表又叫参数签名,包括参数的类型.参数的个数和参数的顺 ...
- English trip -- 国际音标表
26个字母音标表 A a [ei] B b [bi:] C c [si:] D d [di:] E e [i:] F f [ef] G g [dʒi:] H h [eit∫] I i [ai] J j ...
- JVM中对象的内存布局与访问定位
一.对象的内存布局 已主流的HotSpot虚拟机来说, 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填 ...
- php-------代码加密的几种方法
代码加密,也是保护网站安全的一种方法,以下我们来介绍一下如何通过PHP的自定义函数来加密我们的PHP代码. 方法一: <?php function encode_file_contents($f ...
- iOS UI-UIScrollView控件实现图片轮播 (UIPageControl-分页指示器)
一.实现效果 实现图片的自动轮播 二.实现代码 storyboard中布局 代码: #import "ViewController.h" #define HM ...
- Mac安装fish shell
1.brew update 2.brew install fish 3.sudo vi /etc/shells 增加内容:/usr/local/bin/fish ##增加fish到shell环境变 ...
- Windows系统配置Python环境,python2和python3共存
Windows系统配置python2和python3共存 1.下载python: https://www.python.org/downloads/ 注:选择需要的版本(python2 or ...
- spring cloud学习(四) Fegin 的使用
Feign 的使用 什么是Feign? Feign : Declarative REST clients. Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创 ...
- Openwrt Support MINI-PCIE EC20 (6)
1 Scope of Document This document describes MINI PCIE usb hardware design, for EC20 4G module 2 ...
- js打开、关闭页面和运行代码那些事
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...