环上的游戏(cycle)

有一个取数的游戏。初始时,给出一个环,环上的每条边上都有一个非负整数。这些整数中至少有一个0。然后,将一枚硬币放在环上的一个节点上。两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流取数,取数的规则如下:

(1)选择硬币左边或者右边的一条边,并且边上的数非0;

(2)将这条边上的数减至任意一个非负整数(至少要有所减小);

(3)将硬币移至边的另一端。

如果轮到一个玩家走,这时硬币左右两边的边上的数值都是0,那么这个玩家就输了。

如下图,描述的是Alice和Bob两人的对弈过程,其中黑色节点表示硬币所在节点。结果图(d)中,轮到Bob走时,硬币两边的边上都是0,所以Alcie获胜。

现在,你的任务就是根据给出的环、边上的数值以及起点(硬币所在位置),判断先走方是否有必胜的策略。

【输入格式】

第一行一个整数N(N≤20),表示环上的节点数。

第二行N个数,数值不超过30,依次表示N条边上的数值。硬币的起始位置在第一条边与最后一条边之间的节点上。

【输出格式】

仅一行。若存在必胜策略,则输出“YES”,否则输出“NO”。

【样例】

cycle.in cycle.out

4

2 5 3 0 YES

cycle.in cycle.out

3

0 0 0 NO

最后取到数的人获胜

博弈

/*
比较简单的博弈题
手动模拟一下
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,a[],s;
int main()
{
freopen("cycle.in","r",stdin);
freopen("cycle.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
if(a[i]==)break;
else s++;
for(int i=n;i>=;i--)
if(a[i]==)break;
else s++;
if(s&)printf("YES\n");
else printf("NO\n");
return ;
}

舞蹈课(dancingLessons)

问题描述

有n个人参加一个舞蹈课。每个人的舞蹈技术由整数来决定。在舞蹈课的开始,他们从左到右站成一排。当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞。如果相差最小的不止一对,那么最左边的那一对出列。一对异性出列之后,队伍中的空白按原顺序补上(即:若队伍为ABCD,那么BC出列之后队伍变为AD)。舞蹈技术相差最小即是的绝对值最小。

你的任务是,模拟以上过程,确定跳舞的配对及顺序。

输入

第一行为正整数:队伍中的人数。下一行包含n个字符B或者G,B代表男,G代表女。下一行为n个整数。所有信息按照从左到右的顺序给出。在50%的数据中,。

输出

第一行:出列的总对数k。接下来输出k行,每行是两个整数。按跳舞顺序输出,两个整数代表这一对舞伴的编号(按输入顺序从左往右1至n编号)。请先输出较小的整数,再输出较大的整数。

样例输入

4

BGBG

4 2 4 3

样例输出

2

3 4

1 2

样例输入

4

BGBB

1 1 2 3

样例输出

1

1 2

贪心

/*
贪心+堆优化
一开始把所有挨着的男女放进去
然后拿出Abs最小的 同时看看新生成的挨着的能不能组合成一组
注意一些细节的处理
开始wa了一个点
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define maxn 200010
#define inf 0x7fffffff
using namespace std;
int n,a[maxn],cnt,f[maxn],s1,s2;
char c[maxn];
struct node{
int l,r,C;
bool operator < (const node &x) const{
if(x.C==C)return x.l<l;
return x.C<C;
}
}ans[maxn],t;
priority_queue<node>q;
int init(){
int x=,f=;char s=getchar();
while(s<''||s>''){if(s=='-')f=-;s=getchar();}
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x*f;
}
int Abs(int x){
return x<?-x:x;
}
int main()
{
// freopen("dancingLessons.in","r",stdin);
//freopen("dancingLessons.out","w",stdout);
n=init();
scanf("%s",c+);
for(int i=;i<=n;i++)
if(c[i]=='B')s1++;
else s2++;
for(int i=;i<=n;i++)
a[i]=init();
for(int i=;i<=n;i++)
if(c[i-]!=c[i])
q.push((node){i-,i,Abs(a[i]-a[i-])});
while(!q.empty()){
int falg=;
while(){
if(q.empty()){falg=;break;}
t=q.top();q.pop();
if(f[t.l]||f[t.r])continue;
else break;
}
if(q.empty()&&falg)break;//这里多一个falg标记 表示q空时最后一个合不合法
ans[++cnt].l=t.l;ans[cnt].r=t.r;
f[t.l]=;f[t.r]=;
int L=t.l-,R=t.r+;
while(f[L])L--;
while(f[R])R++;
if(L&&R<=n&&c[L]!=c[R])
q.push((node){L,R,Abs(a[R]-a[L])});
}
printf("%d\n",cnt);
for(int i=;i<=cnt;i++)
printf("%d %d\n",ans[i].l,ans[i].r);
return ;
}

数位和乘积(digit.cpp/c/pas)

【题目描述】

一个数字的数位和乘积为其各位数字的乘积。求所有的N位数中有多少个数的数位和乘积恰好为K。请注意,这里的N位数是可以有前导零的。比如01,02视为二位数,但是他们的数位和乘积都是0。

【输入格式】

一行两个整数N,K

【输出格式】

一个行一个整数表示结果。

【样例输入】

2 3

【样例输出】

2

【样例输入2】

2 0

【样例输出2】

19

【数据范围】

对于20%:N <= 6。

对于50%:N<=16

存在另外30%:K=0。

对于100%:N  <= 50,0 <= K <= 10^9。

暴力50

/*
我是蒟蒻没有想出正解...
打了个暴力 当然也不是裸裸的
k==0 10^n-9^n
分成两段 每段分别暴力 在hash一下(不知为啥hash最小的数据不对 写了map)
还有一些小剪枝
目测n<=15的都能过
但是说好的%30<=16结果全尼玛是16 你故意的吧
然后就只拿到了基础的暴力分50
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<ctime>
#define mod 233333
using namespace std;
int n,k,N,falg,ans[],J[];
map<int,int>p;
void Add(int a[],int b[]){
int c[];
memset(c,,sizeof(c));
int len=max(a[],b[]);
for(int i=;i<=len;i++)
c[i]=a[i]+b[i];
for(int i=;i<=len;i++)
if(c[i]>){
c[i+]++;c[i]%=;
}
if(c[len+])len++;c[]=len;
for(int i=;i<=len;i++)a[i]=c[i];
}
void Jian(int a[],int b[]){
int c[];
memset(c,,sizeof(c));
int len=max(a[],b[]);
for(int i=;i<=len;i++)
c[i]=a[i]-b[i];
for(int i=;i<=len;i++)
if(c[i]<){
c[i+]--;c[i]+=;
}
for(int i=len;i>=;i--)
if(c[i]){
c[]=i;break;
}
for(int i=;i<=len;i++)a[i]=c[i];
}
void Mul(int a[],int x){
int c[];
memset(c,,sizeof(c));
int len=a[];
for(int i=;i<=len;i++)
c[i]=a[i]*x;
for(int i=;i<=len;i++)
if(c[i]>){
c[i+]+=c[i]/;
c[i]%=;
}
while(c[len+]>){
len++;
c[len+]+=c[len]/;
c[len]%=;
}
if(c[len+])len++;c[]=len;
for(int i=;i<=len;i++)a[i]=c[i];
}
void Cal(int x){
int a[];
memset(a,,sizeof(a));
while(x){
a[++a[]]=x%;x/=;
}
Add(ans,a);
}
void Dfs(int now,int s,int r){
if(r>k)return;
if(now==N+){
if(!falg)p[r]++;
else{
if(r){
int t=k/r;
if(t*r==k)Cal(p[t]);
}
}
return;
}
for(int i=;i<=;i++)
Dfs(now+,s*+i,r*i);
}
void Solve(){
ans[]=;ans[]=;
J[]=;J[]=;
for(int i=;i<=n;i++)
Mul(ans,);
for(int i=;i<=n;i++)
Mul(J,);
Jian(ans,J);
}
int main()
{
//freopen("digit.in","r",stdin);
//freopen("digit.out","w",stdout);
scanf("%d%d",&n,&k);
if(k==)Solve();
else{
N=n/;Dfs(,,);
falg=;
N=n;Dfs(n/+,,);
}
for(int i=max(ans[],);i>=;i--)
printf("%d",ans[i]);
return ;
}

正解dp

/*
正解还是很机智的Orz
f[i][j][k][l][r]前i位选了j个2 k个3 l个5 r个7的方案数
然后+个高精就ok了
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,k,ans[],J[];
int f[][][][][];
void Add(int a[],int b[]){
int c[];
memset(c,,sizeof(c));
int len=max(a[],b[]);
for(int i=;i<=len;i++)
c[i]=a[i]+b[i];
for(int i=;i<=len;i++)
if(c[i]>){
c[i+]++;c[i]%=;
}
if(c[len+])len++;c[]=len;
for(int i=;i<=len;i++)a[i]=c[i];
}
void Jian(int a[],int b[]){
int c[];
memset(c,,sizeof(c));
int len=max(a[],b[]);
for(int i=;i<=len;i++)
c[i]=a[i]-b[i];
for(int i=;i<=len;i++)
if(c[i]<){
c[i+]--;c[i]+=;
}
for(int i=len;i>=;i--)
if(c[i]){
c[]=i;break;
}
for(int i=;i<=len;i++)a[i]=c[i];
}
void Mul(int a[],int x){
int c[];
memset(c,,sizeof(c));
int len=a[];
for(int i=;i<=len;i++)
c[i]=a[i]*x;
for(int i=;i<=len;i++)
if(c[i]>){
c[i+]+=c[i]/;
c[i]%=;
}
while(c[len+]>){
len++;
c[len+]+=c[len]/;
c[len]%=;
}
if(c[len+])len++;c[]=len;
for(int i=;i<=len;i++)a[i]=c[i];
}
void Cal(int x){
int a[];
memset(a,,sizeof(a));
while(x){
a[++a[]]=x%;x/=;
}
Add(ans,a);
}
void Solve(){
ans[]=;ans[]=;
J[]=;J[]=;
for(int i=;i<=n;i++)
Mul(ans,);
for(int i=;i<=n;i++)
Mul(J,);
Jian(ans,J);
for(int i=max(ans[],);i>=;i--)
printf("%d",ans[i]);
}
void solve(){
int t1=,t2=,t3=,t4=;
while(k%==)k/=,t1++;
while(k%==)k/=,t2++;
while(k%==)k/=,t3++;
while(k%==)k/=,t4++;
if(k>){cout<<;return;}
f[][][][][]=;
f[][][][][]=;
for(int i=;i<=n;i++)
for(int j=t1;j>=;j--)
for(int k=t2;k>=;k--)
for(int l=t3;l>=;l--)
for(int r=t4;r>=;r--){
if(j>=)Add(f[j][k][l][r],f[j-][k][l][r]);//
if(k>=)Add(f[j][k][l][r],f[j][k-][l][r]);//
if(j>=)Add(f[j][k][l][r],f[j-][k][l][r]);//
if(l>=)Add(f[j][k][l][r],f[j][k][l-][r]);//
if(j>=&&k>=)Add(f[j][k][l][r],f[j-][k-][l][r]);//
if(r>=)Add(f[j][k][l][r],f[j][k][l][r-]);//
if(j>=)Add(f[j][k][l][r],f[j-][k][l][r]);//
if(k>=)Add(f[j][k][l][r],f[j][k-][l][r]);//
}
for(int i=max(f[t1][t2][t3][t4][],);i>=;i--)
printf("%d",f[t1][t2][t3][t4][i]);
}
int main()
{
//freopen("digit.in","r",stdin);
//freopen("digit.out","w",stdout);
scanf("%d%d",&n,&k);
if(k==)Solve();
else solve();
return ;
}

9.29noip模拟试题的更多相关文章

  1. 7.29NOIP模拟赛

    7.29NOIP模拟赛 T1 YSG (1s,64MB,ysg.in,ysg.out) 描述 ysg,yxy,azw 三人正在刷题. 他们每做一题的时间都是一个有理数. 如果在某一时刻,三人同时做完一 ...

  2. 模拟试题C

    模拟试题C 一.单项选择题(2′*14 =28′) 1.双线性法向插值法(Phong Shading)的优点是( ) A)法向计算精确 B)高光域准确 C)对光源和视点没有限制 D)速度较快 2.用编 ...

  3. 模拟试题B

    模拟试题B 一.单项选择题(2′*8 =16′) 1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( ) A)512KB B)1MB C)2MB D)3MB 2.在多 ...

  4. 模拟试题A

    模拟试题A 一.单项选择题(2′*12=24′) 1.下面各种坐标变换中,会产生变换前后维度的改变的是( ) A)建模变换 B)观察变换 C)投影变换 D)视口变换 2.下列描述深度缓冲消隐算法的特点 ...

  5. CCF 模拟试题——出现次数最多的数 官方答案解析及自己写的正确答案

    前几天知道的CCF计算机职业资格认证考试,觉得好像比软考含金量高一些,就去了解了一下,做了模拟试题中的 “出现次数最多的数” 这道题,我的算法和官方答案算法不同,个人觉得觉得官方的好一点,没那么繁琐, ...

  6. 11.9 noip模拟试题

    NOIP2016 模拟赛——那些年,我们学过的文化课背单词(word.c/cpp/pas)[题目描述]fqk 退役后开始补习文化课啦, 于是他打开了英语必修一开始背单词. 看着满篇的单词非常头疼, 而 ...

  7. 10.26 noip模拟试题

    enc[问题背景]zhx 和他的妹子聊天.[问题描述]考虑一种简单的加密算法.假定所有句子都由小写英文字母构成,对于每一个字母,我们将它唯一地映射到另一个字母.例如考虑映射规则:a->b, b- ...

  8. 9.20 noip模拟试题

      Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一届的学弟学妹,邪恶的chenzeyu97发现一位学弟与他同名,于是他当起了善良的学长233 “来来来,学弟,我 ...

  9. 9.16noip模拟试题

    题目描述 在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女.某一天,早苗终于入手了最新款的钢达姆模型.作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重).早苗的 ...

随机推荐

  1. 网页错误404 or 500

    HTTP 错误 400 400 请求出错 由于语法格式有误,服务器无法理解此请求.不作修改,客户程序就无法重复此请求. HTTP 错误 401 401.1 未授权:登录失败 此错误表明传输给服务器的证 ...

  2. 【技术贴】解决myeclipse SVN 提交代码 commit:remains in tree-conflict错误的解决办法

    [技术贴]解决myeclipse SVN 提交代码 commit:remains in tree-conflict错误的解决办法 错误是:Aborting commit: xxxxx’ remains ...

  3. 在DJANGO的类视图中实现登陆要求和权限保护

    以前接触的是基于函数的保护,网上材料比较多. 但基于类视图的很少. 补上! Decorating class-based views 装饰类视图 对于类视图的扩展并不局限于使用mixin.你也可以使用 ...

  4. Delphi 版本号(D1到XE6),发现一个delphi.wikia.com网站

    Borland Compiler Conditional Defines  Edit  Talk1 2,909PAGES ONTHIS WIKI   Product Name Version Cond ...

  5. 标量子查询优化(用group by 代替distinct)

    标量子查询优化 当使用另外一个SELECT 语句来产生结果中的一列的值的时候,这个查询必须只能返回一行一列的值.这种类型的子查询被称为标量子查询 在某些情况下可以进行优化以减少标量子查询的重复执行,但 ...

  6. 算法-KMP模式匹配算法

    1朴素算法:逐个比较 2 主要是解决多余比较的麻烦,通过处理比较字符串是否含有重复的字符的问题.

  7. web版本控制

    说说你在web开发中是怎么进行版本管理的 在web开发中,我首先将系统框架搭建完成后,我会发布到服务器上,然后给小组成员进行分工,为他们划分各自的模块,他们每天早上上班时就从服务器上先将自己机器上面的 ...

  8. SolrCloud应用简介

    1.windows下启动实例工程 官网下载solr后解压到本地硬盘,在sol/bin目录下打开命令行窗口,然后测试以下命令: solr -e cloud 启动例子中的solrcould,进入交互界面, ...

  9. 水题:HDU 5112 A Curious Matt

    Description There is a curious man called Matt. One day, Matt's best friend Ted is wandering on the ...

  10. Linux学习笔记29——IPC状态命令

    一 IPC IPC是进程间通讯,在前面,我们相继学习了进程间通讯机制有信号量,内存共享,消息队列.状态命令(ipcs)和删除命令(ipcrm)提供了一种检查和清理IPC机制的方法. 二 状态命令 1 ...