冲刺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. 1.日历游戏

【问题描述】

moreD和moreD的宠物CD正在玩一个日历游戏,开始时,他们从1900年1月1日到2012年12月22日(你懂的……)选一个日期开始,依次按照如下规则之一向后跳日期:

  1. 跳到日历上的下一天。
  2. 跳到日历上的下个月的同一天(如果不存在,则不能这么做)。

要是谁正好到达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的更多相关文章

  1. 11/1 NOIP 模拟赛

    11.1 NOIP 模拟赛 期望得分:50:实际得分:50: 思路:暴力枚举 + 快速幂 #include <algorithm> #include <cstring> #in ...

  2. 11.7 NOIP模拟赛

    目录 2018.11.7 NOIP模拟 A 序列sequence(two pointers) B 锁lock(思路) C 正方形square(埃氏筛) 考试代码 B C 2018.11.7 NOIP模 ...

  3. NOIP模拟赛-2018.11.7

    NOIP模拟赛 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 如果用命令行编译程序可以发现没加头文件之类的错误. 编译之前另存一份,听说如果敲 ...

  4. NOIP模拟赛-2018.11.6

    NOIP模拟赛 今天想着反正高一高二都要考试,那么干脆跟着高二考吧,因为高二的比赛更有技术含量(我自己带的键盘放在这里). 今天考了一套英文题?发现阅读理解还是有一些困难的. T1:有$n$个点,$m ...

  5. NOIP模拟赛-2018.11.5

    NOIP模拟赛 好像最近每天都会有模拟赛了.今天从高二逃考试跑到高一机房,然而高一也要考试,这回好像没有拒绝的理由了. 今天的模拟赛好像很有技术含量的感觉. T1:xgy断句. 好诡异的题目,首先给出 ...

  6. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  7. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  8. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  9. 10.17 NOIP模拟赛

    目录 2018.10.17 NOIP模拟赛 A 咒语curse B 神光light(二分 DP) C 迷宫maze(次短路) 考试代码 B 2018.10.17 NOIP模拟赛 时间:1h15min( ...

  10. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

随机推荐

  1. 【zabbix】自动注册,实现自动发现agent并添加监控(agent不需要任何配置)

    更新: 后来在实际使用中发现,与其使用zabbix自动注册,不如直接调用zabbix的api主动发起添加服务器的请求,这样就不需要在zabbixserver上配置host信息了.实现全自动.具体调用方 ...

  2. fragment静态加载

    import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.util.Log; / ...

  3. 3 《锋利的jQuery》jQuery中的DOM操作

    DOM操作分(1)DOM Core(核心):document.geElementsByTagName("form");/ element.getAttribute("sr ...

  4. .NET ViewState对于画面的速度影响

    最近开发一个.NET网站,发现有一个画面的交互特别缓慢,查了很多原因都没查到 最后终于知道,是因为画面的ViewState用的过多,其中有一个ViewState保存的数据相对而言比较大,导致了画面的运 ...

  5. HDU 1201 Fibonacci Again

    Fibonacci Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. IOS AppStore介绍图的尺寸大小(还有一些自己被拒的分享...)

    4s:640*960 5:640*1136 6:750*1334 6P:1242*2208 -------现在新版本的iTunes connect里只上传6P版本的大小就可以了,其他版本苹果会自动分辨 ...

  7. html5--1.19 通用属性

    html5--1.19 通用属性 学习要点: 1.通用属性的概念及几个常用的通用属性2.对属性值的若干点补充 通用属性 通用属性(全局属性)可以用于任何的HTML5元素:通用属性有十几种:这节课不会全 ...

  8. less语言特性

    作为CSS的一种扩展,LESSCSS不仅向下兼容CSS的语法,而且连新增的特性也是使用CSS的语法.这样的设计使得学习LESS很轻松,而且你可以在任何时候回退到CSS. 变量 很容易理解: @nice ...

  9. mysql修改初始密码

    通过MySQL命令行,可以修改MySQL数据库的密码,下面就为您详细介绍该MySQL命令行,如果您感兴趣的话,不妨一看. 格式:mysqladmin -u用户名 -p旧密码 password 新密码 ...

  10. 集训Day13

    我这个肥宅一点都不快乐嘤嘤嘤 bzoj3456 求n个点的无向简单连通图的个数 我们可以用容斥推出递推式 首先我们令为 于是有 这样就是可以用CDQ分治解决的一类递推式了 不是那么明显的变形一下得到 ...