2014-11-1 NOIP模拟赛1
冲刺NOIP2014复赛模拟题第六套第二试
|
题目名称 |
日历游戏 |
最大公约数 |
密码 |
|
英文代号 |
calendar |
gcd |
pasuwado |
|
输入文件名 |
calendar.in |
gcd.in |
pasuwado.in |
|
输出文件名 |
calendar.out |
gcd.out |
pasuwado.out |
|
时限 |
1秒 |
1秒 |
1秒 |
|
空间限制 |
128M |
256M |
256M |
|
测试点数目 |
20 |
10 |
10 |
|
测试点分值 |
5 |
10 |
10 |
|
是否有部分分 |
无 |
无 |
无 |
|
附加文件 |
无 |
无 |
无 |
|
题目类型 |
传统 |
传统 |
传统 |
|
是否有SPJ |
无 |
无 |
无 |
注意:最终测试时,所有编译命令均不打开任何优化开关。
请独立完成题目,不要讨论,不得使用搜索引擎。
1.日历游戏
【问题描述】
moreD和moreD的宠物CD正在玩一个日历游戏,开始时,他们从1900年1月1日到2012年12月22日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期:
- 跳到日历上的下一天。
- 跳到日历上的下个月的同一天(如果不存在,则不能这么做)。
要是谁正好到达2012年12月22日那么他就赢了,如果到达这天之后的日期那他就输了——原因你也懂的。
每次都是moreD先走的。
现在,给你一个日期,请问moreD一定能赢吗?
【输入】
输入共T行,每行三个整数,Y、M、D,分别表示年、月、日。日期在1900年1月1日到2012年12月22日之间(包含两端)。
T并不在输入数据当中。
【输出】
要是moreD一定能赢,输出一行YES,否则输出NO。
【输入输出样例一】
|
calendar.in |
calendar.out |
|
2012 12 20 |
NO |
【输入输出样例二】
|
calendar.in |
calendar.out |
|
2012 12 21 |
YES |
【数据描述】
对于50%的数据,是1949年1月1日后的日期。 T <= 5
对于100%的数据,是1900年1月1日后的日期。T <= 10
/*
结束局面是必败态。
必胜态可以走到必败态。
必败态只能走到必胜态。
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int T;
int a[]={,,,,,,,,,,,};
int f[][][];
bool lea(int x){
if(x%==||(x%==&&x%!=))return ;
return ;
}
bool jud(int x,int y,int z){//判断x,y,z这天是否存在
if(x>||y>||z>)return ;
if(x==&&y==&&z>=)return ;
if(y==){
if(z>a[]+lea(x))return ;
}
else if(z>a[y-])return ;
return ;
}
int dp(int x,int y,int z){
if(x==&&y==&&z==)return ;//必败态
if(f[x][y][z]!=-)return f[x][y][z];
int sg[];memset(sg,,sizeof(sg));
int tx=x,ty=y,tz=z,lim=a[y-];//年月日以及这一个月的最大天数
tz++;//加一天
if(y==&&lea(tx))lim++;
if(tz==lim+)tz=,ty++;
if(ty==)tx++,ty=;
if(jud(tx,ty,tz))sg[dp(tx,ty,tz)]=;
tx=x,ty=y,tz=z;
ty++;
if(ty==)tx++,ty=;
if(jud(tx,ty,tz))sg[dp(tx,ty,tz)]=;
for(int i=;i<;i++)
if(!sg[i])
return f[x][y][z]=i;
}
int main()
{
freopen("calendar.in","r",stdin);
freopen("calendar.out","w",stdout);
memset(f,-,sizeof(f));
int x,y,z;
while(scanf("%d%d%d",&x,&y,&z)!=EOF)
{
for(int i=;i>=;i--)dp(i,,);
if(dp(x,y,z))puts("YES");
else puts("NO");
}
return ;
}
100分 SG函数
2.最大公约数
【问题描述】
话说CD比较欠扁,他表示在课室的日子没有教主在旁边打他的日子太寂寞了,所以这一晚,他终于来到了电脑室被打。由于CD是大家的宠物,于是大家都来打CD了。电脑室里有n个人,第i个人希望打CD ai下。但是太多人打CD,他又会不爽,于是他规定只能有K个人打到他,并且为了公平起见,最终K个人打他的次数都必须是相同的,CD规定这个次数就是这K个人希望打他的次数的最大公约数。为什么是最大公约数呢?因为他觉得被打的次数是GCD的话他才会变成Glad CD。之前说了,CD比较欠扁,于是CD希望,K个人打他的次数的和最大。你能告诉他他最后总共会被打多少下么?
【输入格式】
第一行两个正整数n,k。
第二行n个正整数,表示每个人希望打CD多少下。
【输出格式】
输出一个正整数表示CD会被打多少下。
【样例输入输出】
|
gcd.in |
gcd.out |
|
3 1 1 2 3 |
3 |
【数据说明】
对于30%的数据,保证k≤n≤20。
对于50%的数据,保证输入中所有数小于5000。
对于100%的数据,保证输入中所有数小于500000,k≤n。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 500010
int n,k,a[maxn],ans;
void dfs(int pos,int g,int cnt){
if(cnt==k){ans=max(ans,g);return;}
if(pos>n)return;
if(g<=ans)return;
if(k-cnt>n-pos+)return;
int gnow=__gcd(g,a[pos]);
dfs(pos+,g,cnt);
dfs(pos+,gnow,cnt+);
}
int main(){
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)dfs(i+,a[i],);
ans*=k;
printf("%d",ans);
}
30分 暴力
/*
先开50W个桶存下每个数出现了几次,然后枚举最后的答案gcd,然后再暴力枚举所有它的倍数,看出现次数是否大于等于k就可以了。
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#define ll long long
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,K;
int f[];
bool jud(int x){
int sum=;
for(int i=;x*i<=;i++)
sum+=f[x*i];
if(sum>=K)return ;
return ;
}
int main(){
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
n=read();K=read();
for(int i=;i<=n;i++){
int x=read();
f[x]++;
}
for(int i=;i;i--){
if(jud(i)){
printf("%I64d\n",(ll)i*K);
return ;
}
}
return ;
}
100分 官方做法
3.密码
【问题描述】
哪里有压迫,哪里就有反抗。
moreD的宠物在法庭的帮助下终于反抗了。作为一只聪明的宠物,他打算把魔法使moreD的魔法书盗去,夺取moreD的魔法能力。但moreD怎么会让自己的魔法书轻易地被盗取?moreD在魔法书上设置了一个密码锁,密码锁上有一个问题。
施以斯卧铺魔法吧,你有M次机会,如此将得完美密码。
然后是一串小写字母串。
moreD的宠物斯卧铺魔法就是施法时的字符串其中相邻两位交换。
而moreD对于完美密码的定义自然是最小字典序了。
请帮助moreD的宠物,想出密码吧。
【输入格式】
第一行一个整数M,表示操作次数。
第二行一串小写字母组成的字符串S,如题目所示。
【输出格式】
输出完美密码。
【输入样例】
3
dcba
【输出样例】
adcb
【数据范围】
对于30%的数据|S|≤10
对于60%的数据|S|≤3,000
对于100%的数据8≤|S|≤100,000 M≤(|S|-8)^2+2
【后记】
宠物最终战胜了moreD,和自己的宠物快乐地生活着。
【样例解释】
先对第3,4两位施法,字符串变成dcab,然后对第2,3两位施法,字符串变成dacb,最后对第1,2两位施法,字符串变成adcb。
/*
每个字母目前最前是哪一个,可以用链表维护。
另外目前需要的操作数可以就等于目标字母所在位置之前有多少个剩余的没有用的字母,可以用树状数组维护。
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <string>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
ll M;
int len;
int C[],next[],head[];
char S[];
inline void add(int x,int pos){
next[pos]=head[x]; head[x]=pos;
}
inline void update(int x,int v){
for(int i=x;i<=len;i+=i&-i) C[i]+=v;
}
inline int query(int x){
if(x==) return ;
int res=;
for(int i=x;i>;i-=i&-i) res+=C[i];
return res;
}
int main(){
freopen("pasuwado.in","r",stdin);
freopen("pasuwado.out","w",stdout);
scanf("%lld",&M);
scanf("%s",S+);
len=strlen(S+);
for(int i=len;i>=;i--) add(S[i]-'a',i);
for(int i=;i<=len;i++) update(i,);
for(int i=;i<len;i++) {
int j;
for(j=;j<;j++) {
int tmp;
if(head[j]!=&& (tmp=query(head[j]-))<=M){
M-=tmp;
update(head[j],-);
head[j]=next[head[j]];
break;
}
}
printf("%c",j+'a');
}
return ;
}
100分 链表+树状数组
2014-11-1 NOIP模拟赛1的更多相关文章
- 11/1 NOIP 模拟赛
11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...
- 11.7 NOIP模拟赛
目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...
- NOIP模拟赛-2018.11.7
NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...
- NOIP模拟赛-2018.11.6
NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...
- NOIP模拟赛-2018.11.5
NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 10.17 NOIP模拟赛
目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
随机推荐
- 扫盲--.net 程序集
前言:用了几天的时间把高级编程里面程序集一章看完了,原来自己只知道写代码,右键添加引用,从来也不知道操作的实质是什么,微软总是这个套路,鼠标点点就能把任务完成,这对新手友好但是对要通透了解程序执行和内 ...
- Java for LeetCode 113 Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- selector + drawable 多状态图形
select_drawble.xml<?xml version="1.0" encoding="utf-8"?> <selector xmln ...
- 《高性能Javascript》 Summary(一)
第一章.加载和执行 Loading & Execution 原因:Javascript 的执行导致页面渲染中止等待. 解决: 将script放在页面底部,紧靠body 闭合标签之前,保证页面在 ...
- 笔记 jsp/ajax/js/jquery/html5/css+div->table
1. jsp 1).jsp(39,33) equal symbol expected: 这个异常是说第39行有 " '( 冒号单引号)问题 2)${map[key]} map和key换 ...
- BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线:spfa + 二分【路径中最大边长最小】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1614 题意: 给你一个无向图,n个点,m条边. 你需要找出一条从1到n的路径,使得这条路径 ...
- RQNOJ 569 Milking Time:dp & 线段问题
题目链接:https://www.rqnoj.cn/problem/569 题意: 在一个数轴上可以摆M个线段,每个线段的起始终止端点给定(为整数),且每个线段有一个分值,问如何从中选取一些线段使得任 ...
- tensorflow 实现逻辑回归——原以为TensorFlow不擅长做线性回归或者逻辑回归,原来是这么简单哇!
实现的是预测 低 出生 体重 的 概率.尼克·麦克卢尔(Nick McClure). TensorFlow机器学习实战指南 (智能系统与技术丛书) (Kindle 位置 1060-1061). Kin ...
- Workerman安装流程
第一步检测安装环境 curl -Ss http://www.workerman.net/check.php | php 操作结果显示 报错了 需要找到php.ini文件 解决办法如下: 打开 php ...
- Visual Studio 2012简体中文专业版密钥(激活码)
VS2012 正式版在Beta版的基础上进行了很多改进,尤其是加入了全新的用户界面. VS2012 的硬件需求与VS2010相同,不过由于 Visual Studio 2012 利用了新版 Windo ...