环上的游戏(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. Hive的Metastore contains multiple versions

    hive 客户端报错:Exception in thread "main" java.lang.RuntimeException: java.lang.RuntimeExcepti ...

  2. 《Braid》碎片式台词

    谁见到过风? 你没有,我也没有. 但当树儿低下头, 便是风儿经过时. 便是风儿穿过的时候. 但当树叶微微摇首, 你没有,我也没有. 谁见到过风? 二.时间与宽恕 1.提姆要出发了!他要去寻找并救出公主 ...

  3. android ADT Bundle for Mac下载地址

    直接下载解压就能用 http://developer.android.com/sdk/index.html

  4. 横向技术分析C#、C++和Java优劣

    转自横向技术分析C#.C++和Java优劣 C#诞生之日起,关于C#与Java之间的论战便此起彼伏,至今不辍.抛却Microsoft与Sun之间的恩怨与口角,客观地从技术上讲,C#与Java都是对传统 ...

  5. 你真的了解 MySQL 数据库的运行状况吗?

    2015年第三方市场调查机构 Evans 数据公司最近公布的一系列客户调查数据显示,在过去两年里,MySQL 在所有开发者使用的数据库中获得了25%的市场份额,Evans 公司的本次调查显示,数据库的 ...

  6. Spring与Oauth2整合示例 spring-oauth-server

    原文地址:http://www.oschina.net/p/spring-oauth-server?fromerr=vpTctDBF

  7. ibatis把表名作为一个参数报错问题的解决方案

    用ibatis的时候,想把表名也作为一个参数传进去,可是报错了,在ibatis配置文件里面是#resource#的方式,报错信息如下: org.apache.cxf.interceptor.Fault ...

  8. QT内置的ICON资源

    QT内置的ICON资源保存在QStyle类里. 可以通过成员函数 QStyle::standardIcon 来获取. 保存的icon有: enum QStyle::StandardPixmap Thi ...

  9. AVOIR发票的三种作用

    1. 开错了发票,应收多写了,应该抵消掉一部分应收2. 客户临时有变化,比如只买一部分产品,取消了另一部分,那么也是开AVOIR抵消了一部分应收3. 退钱给客户的时候,也要开一张AVOIR发票 注意, ...

  10. Node.js权威指南 (6) - 在Node.js中操作文件系统

    6.1 同步方法与异步方法 / 856.2 对文件执行读写操作 / 86 6.2.1 文件的完整读写 / 86 6.2.2 从指定位置处开始读写文件 / 916.3 创建与读取目录 / 97 6.3. ...