石头剪子布、水库、贪婪的送礼者 noip
【CC++】例题4-2刽子手游戏算法竞赛入门经典函数和递归
【CC++】例题4-2刽⼦⼿游戏算法竞赛⼊门经典函数和递归【题⽬】猜单词游戏。
计算机想⼀个单词让你猜,你每次猜⼀个字母。
如果单词⾥有那个【字母】,【所有该字母会显⽰出来】。
如果没有那个字母,算猜错⼀次。
【最多只能猜错六次】猜⼀个已经猜过的字母也算错。
【样例输⼊】1cheesechese2cheeseabcdefg3cheeseabcdefgij-1【样例输出】Round 1You win.Round 2You chickened out.Round 3You lose.【思路】为了实现“如果单词⾥有那个【字母】,【所有该字母会显⽰出来】。
猜⼀个已经猜过的字母也算错。
”的需求:先看计算机的问题串中是否有这个字母,如果有,把所有这个字母都换成空格。
遍历串2的每⼀个字母,对于每⼀个字母,读取字母,看这个字母在串1中是否存在(遍历串1).再执⾏如上操作。
chickened out 和 win 的区别是 chickened out没有把问题串中所有字都覆盖到。
尽管⼆者的错误都⼩于7.【代码】#include <iostream>#include <cstdlib>#include <string.h>using namespace std;const int maxn = 25;char* message[] = {"You win.", "You lose.", "You chickened out."};void guess(char a, char str[], int len, int& wrong){//考虑读⼊进来的字符,是不是在题⽬串中存在int flag = 0;//char temp;for (int i = 0; i < len; i++){if (str[i] == a){flag = 1;break;}//cout << i <<"wrong" << wrong << endl;}//如果在题⽬串中存在,将所有字符换成空格if (flag){for (int i = 0; i < len; i++){if (str[i] == a){str[i] = ' ';}}}else{wrong++;}}int main(){int n;//数组s_ques为计算机猜测,s_ans为⽤户猜测char s_ques[maxn], s_ans[maxn];//考虑⼀组输⼊while(scanf("%d%s%s",&n, &s_ques, &s_ans) == 3 && n != (-1)) {int wrong = 0;printf("Round %d\n", n);int len1 = strlen(s_ques);int len2 = strlen(s_ans);for (int i = 0; i < len2; i++){guess(s_ans[i], s_ques, len1, wrong);}int cnt = 0;for (int i = 0; i < len1; i++){if (s_ques[i] == ' ') cnt++;}if (wrong < 7 && cnt == len1){cout << message[0] << endl;}else if (wrong > 6){cout << message[1] << endl;}else{cout << message[2] << endl;}}system("pause");}。
NOIP真题汇总
NOIP真题汇总想想在NOIP前总得做做真题吧,于是长达⼀个⽉的刷题开始了涉及2008-2016年⼤部分题⽬NOIP [2008] 4/41、传纸条:清真的三维DP2、笨⼩猴:字符串模拟3、⽕柴棒等式:打表+循环4、双栈排序:贪⼼+栈NOIP [2009] 3/42、Hankson的趣味题:数论,gcd相关3、最优贸易:建图+SPFA4、靶形数独:较难搜索+剪枝NOIP [2010] 4/41、引⽔⼊城:DP+bfs(较好)2、关押罪犯:贪⼼+并查集3、机器翻译:模拟4、乌龟棋:简单DPNOIP [2011] 5/61、铺地毯:模拟2、选择客栈:DP3、Mayan游戏:较难搜索4、计算系数:组合数5、聪明的质检员:⼆分答案+前缀和NOIP [2012] 4/61、Vigenère 密码:字符串2、国王游戏:贪⼼+⾼精4、同余⽅程:扩欧5、借教室:⼆分答案+前缀和NOIP [2013] 5/61、转圈游戏:快速幂2、⽕柴排队:逆序对+贪⼼3、货车运输:最⼩⽣成树+lca4、积⽊⼤赛:递推或者分治5、花匠:简单DPNOIP [2014] 6/61、⽣活⼤爆炸版⽯头剪⼑布:模拟2、联合权值:类树形DP3、飞扬的⼩鸟:类背包DP4、⽆线⽹络发射器选址:模拟5、寻找道路:图论,反向bfs6、解⽅程:秦九韶NOIP [2015] 6/61、神奇的幻⽅:模拟2、信息传递:拓扑排序3、⽃地主:较难搜索4、跳⽯头:⼆分答案5、⼦串:DP6、运输计划:⼆分答案+树上差分NOIP [2016] 6/61、玩具谜题:模拟2、天天爱跑步:lca+树上差分3、换教室:floyd+概率DP4、组合数问题:组合数5、蚯蚓:队列6、愤怒的⼩鸟:状态压缩DP。
NOIP2014 题解
NOIP2014 题解D1T1 : 生活大爆炸版石头剪刀布(rps)100% : 模拟。
另一种方法,可以先求出na,nb 的最小公倍数l ,在[1,l]的区间里模拟,对于剩下的部分,显然是循环了若干次[1,l]内的胜负情况,并剩余了一小部分,于是只要把两人的分数各自乘n div l,再对剩下的部分模拟即可。
复杂度 : O(na*nb)D1T2 : 联合权值(linp)30% : 穷举三个点,判断是否相邻,再统计权值并更新答案。
复杂度 : O(n^3)60% : 穷举一个点,并以该点为起点搜索,查找距离为2的结点,统计后更新答案。
复杂度 : O(n^2)100% : 记][i fa 为结点i 的父亲, ][i pow 是i 的权值。
题目给出了n 个点,n-1条边,那么这是一棵树。
那么考虑树形dp 。
很显然,距离为2的点在一棵树中有且仅有两种不同的位置,第一种是结点i 与结点]][[i fa fa ,第二种则是结点i 与结点j ,其中][][j fa i fa =。
记∑=][][j pow i sum,]}[{]max[j pow Max i =,其中][j fa i =。
那么有∑∑-+=])[]][[(*][]][[*][*2_j pow j fa sum j pow i fa pow i sum sum ans ,]}[*][]],[[*]{max[max _i y i x i fa pow i Max ans =,其中][],[i y i x 是i 的子节点中权值最大的两个。
复杂度 : O(n)D1T3 : 飞扬的小鸟(bird)30% : 搜索。
70% : 考虑动态规划,记],[j i f 为达到坐标),(j i 至少要点击几次屏幕。
则有]])1[,1[,]]1[*,1[(],[-+-+---=i y j i f k i x k j i f Min j i f ,注意考虑边界情况。
复杂度 : O(nm^2)100% : 上述动态规划超时的原因在于转移复杂度太高,如果能将转移复杂度降为O(1),那么就可以轻松将此题AC ,仔细想想发现对于所有可以用于更新],[j i f 的状态的高度都与j 同余(mod x[i-1]),那么在实际实现上述动态规划时,我们可以先穷举同余系,并以高度从低到高进行动态规划,在同一同余系中,记一个变量temp 为已经访问的状态中可以用于更新的最小值,每穷举到一个新的状态,把temp 更新为]),1[,1(j i f temp Min -+,并且只用temp+1更新其他状态。
NOIP知识点带详解
NOIP知识点带详解(详解为转载)。
置顶 2018年06月03日14:39:13 幻码君阅读数1762
本人蒟蒻一枚,以下知识点为自己整理原创,但因为链接为转载所以标签为转载。
本人才上初一,这是我初涉NOIP的第一年,希望大家能给点鼓励,谢谢大家。
温馨提示:红色为重要或难点算法。
基础算法:
图论:
(1)图:最短路;最小生成树;并查集;拓扑排序;差分约束;二分图染色;
(2)树:树上倍增(LCA);dfs序;树的直径、重心;树链剖分。
数论:
最大公约数(gcd)最小公倍数(lcm);线性筛法求素数;中国剩余定理;扩展欧几里得;费马小定理;同余方程;逆元;快速幂(取模);组合数学;矩阵。
数据结构:
链表;队列;栈;线段树;树状数组;哈希表;st表;分块;堆(STL实现:大根堆,小根堆)。
动态规划:
背包问题(01背包,完全背包,混合背包);树形DP;记忆化搜索;递推;DP:环形DP,数位DP,区间DP,序列DP,DP优化(数据结构优化,单调队列优化,斜率优化),状态压缩DP。
字符串:
KMP,AC自动机,字典树(trie)。
noip历届签到题题解
noip历届签到题题解石头剪刀布 //2014/problem/3716/联合权值/problem/3728/无线网络发射器/problem/3578/寻找道路/problem/3731/石头剪刀布打表,找出对应关系。
#include<cstdio>#include<cstdlib>using namespace std;const int m[5][5]={0,0,1,1,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,1,1,1,0,0,0,};int a[205],b[205];int main(){int n,na,nb;scanf("%d %d %d",&n,&na,&nb);for(int i=0;i<na;i++)scanf("%d",&a[i]);for(int i=0;i<nb;i++)scanf("%d",&b[i]);int sa=0,sb=0;for(int i=0;i<n;i++){sa=sa+m[a[i%na]][b[i%nb]]; sb=sb+m[b[i%nb]][a[i%na]]; }printf("%d %d",sa ,sb);return(0);}联合权值#include <iostream>#include <cstdio>#include <vector>#include <algorithm>using namespace std;long long n,p,k,w[200010];bool vis[200010];vector <int> edge[200010];void dfs(int x,int last1,int last2) {v is[x]=1;l ong long t=0,t2=0,t3=0,t4=0;f or (int i=0;i<edge[x].size();i++) {int y=edge[x][i];if (!vis[y]){vis[y]=1;if (last1!=0){k=(k+w[y]*w[last1])%10007;p=max(p,w[y]*w[last1]);}t2+=t*w[y]; t+=w[y];if (w[y]>=t3){t4=t3; t3=w[y];}if (w[y]<t3) t4=max(t4,w[y]);dfs(y,x,last1);}}p=max(t3*t4,p); k=(k+t2)%10007;}int main(){c in>>n;f or (int i=1;i<n;i++){int u,v;cin>>u>>v;edge[u].push_back(v);edge[v].push_back(u);}f or (int i=1;i<=n;i++) cin>>w[i];d fs(1,0,0);cout<<p<<' '<<k*2%10007<<endl;r eturn 0;}有关图的问题,到时候再解决。
noip2014(简单题)全解
现在,小 A 和小 B 尝试玩这种升级版的猜拳游戏。已知他们的出拳都是有 周期性规律的,但周期长度不一定相等。例如:如果小 A 以“石头-布-石头 -剪刀-蜥蜴人-斯波克”长度为 6 的周期出拳,那么他的出拳序列就是“石 头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克……”,而如果小 B 以“剪刀-石头-布-斯波克-蜥蜴人”长度为 5 的周期 出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布 -斯波克-蜥蜴人-……” 已知小 A 和小 B 一共进行 N 次猜拳。每一次赢的人得 1 分,输的得 0 分; 平局两人都得 0 分。现请你统计 N 次猜拳结束之后两人的得分。
i=1; j=1;
if((b[j]==2)||(b[j]==3)) if(b[j]==0) sum++; continue; } if(a[i]==1) { if((b[j]==0)||(b[j]==3)) if(b[j]==1) sum++; continue;
sa++;
sa++;
} if(a[i]==2) {
பைடு நூலகம்
现在政府有关部门准备安装一个传播参数为 d 的无线网络发射器,希望你帮
助他们在城市内找出合适的路口作为安装地点,使得覆盖的公共场所最多。
简单说下坑
菜比思路就是纯暴力,枚举每个能放发射器的地方然后看
哪一个覆盖的公共场所最多。怎么求每个位置的覆盖公共 场所数这里,可以在读入公共场所的位置的时候就把能覆 盖这个公共场所的位置求一下,位置上的覆盖数++;也可 以枚举每个位置时再用双重循环找它的覆盖范围内的公共 场所数。不管怎么玩应该都不会超时。 很多人没有AC,因为这道题有坑。很多人拿了60、70、 80分。 但是英勇的大哥AC了! 坑就是街道是编号为0-128的129条,枚举的边界虽然在这 里面,但是加上了覆盖范围之后就可能数组越界。必须判 断在不在范围内。 仁慈的出题人没有让覆盖范围是圆形。。。幸好是方形。
noip2014(简单题)
(菜比版代码)
高端代码
by:郑懿鸣
const int
dy[5][5]={{0,0,1,1,0},{1,0,0,1,0},{0,1,0,0,1},{0,0,1,0,1},{1,1,0,0, 0}}; 学长为神马只拿60呢? int N,NA,NB,a[220],b[220]; int suma=0,sumb=0; 因为3%3=0!=3 //开一个数组记录每种情况的得分 cin>>N>>NA>>NB; for(int i=1;i<=NA;i++)scanf("%d",&a[i]); for(int i=1;i<=NB;i++)scanf("%d",&b[i]); for(int i=1;i<=N;i++) { int aa=a[i%NA],bb=b[i%NB]; suma+=dy[aa][bb],sumb+=dy[bb][aa]; }
这道题AC的只有8个人,用邻接矩阵写过部
分数据的有很多,拿10分的有一部分,但 是更多的是连10分都不会骗或者像mzx一样 觉得自己能A但是最后却拿了0分的人。 我数了数一试第二道图论题AC的只有6人, 其中5个是前五,所以果断把这道题交给了 lzh。 好了结束。
i=1; j=1;
if((b[j]==2)||(b[j]==3)) if(b[j]==0) sum++; continue; } if(a[i]==1) { if((b[j]==0)||(b[j]==3)) if(b[j]==1) sum++; continue;
NOIP初赛取石子问题解析
拿者取胜。 那么任给一个局势(a,b),怎样判断它是不是奇异局势呢?我们有如下公式: ak =[k(1+√5)/2],bk= ak + k (k=0,1,2,...,n 方括号表示取整函数) 奇妙的是其中出现了黄金分割数(1+√5)/2 = 1.618...,因此,由 ak,bk 组成
的矩形近似为黄金矩形,由于 2/(1+√5)=(√5-1)/2,可以先求出 j=[a(√5-1)/2],若 a=[j(1+√5)/2],那么 a = aj,bj = aj + j,若不等于,那么 a = aj+1,bj+1 = aj+1+ j + 1,若都不是,那么就不是奇异局势。然后再按照上述法则进行,一定会遇到奇异局势。
为了这个问题,参考了一些书籍,找到了一些算法,现在把它放在这里和大家一起共享。 几种有趣的算法:
(一)巴什博奕(Bash Game):只有一堆 n 个物品,两个人轮流从这堆物品中 取物,规定每次至少取一个,最多取 m 个。最后取光者得胜。
显然,如果 n=m+1,那么由于一次最多只能取 m 个,所以,无论先取者拿走多 少个,后取者都能够一次拿走剩余的物品,后者取胜。因此我们发现了如何取胜的法则:如果 n=(m+1)r+s,(r 为任意自然数,s≤m),那么先取者要拿走 s 个物品,如果后取者拿走 k(≤m) 个,那么先取者再拿走 m+1-k 个,结果剩下(m+1)(r-1)个,以后保持这样的取法,那么先取 者肯定获胜。总之,要保持给对手留下(m+1)的倍数,就能最后获胜。
这个游戏还可以有一种变相的玩法:两个人轮流报数,每次至少报一个,最多 报十个,谁能报到 100 者胜。
NOIP2014提高组复赛试题day1day2
CCF全国信息学奥林匹克联赛(NOIP2014)复赛提高组 day11.生活大爆炸版石头剪刀布(rps.cpp/c/pas)【问题描述】石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。
如果两个人出拳一样,则不分胜负。
在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。
升级版游戏在传统的石头剪刀布游戏的基础上,增加了两个新手势:斯波克:《星际迷航》主角之一。
蜥蜴人:《星际迷航》中的反面角色。
这五种手势的胜负关系如表一所示,表中列出的是甲对乙的游戏结果。
表一石头剪刀布升级版胜负关系乙剪刀石头布蜥蜴人斯波克甲对乙的甲结果剪刀平输赢赢输石头平输赢输布平输赢蜥蜴人平赢斯波克平现在,小A和小B尝试玩这种升级版的猜拳游戏。
已知他们的出拳都是有周期性规律的,但周期长度不一定相等。
例如:如果小A以“石头-布-石头-剪刀-蜥蜴人-斯波克”长度为6的周期出拳,那么他的出拳序列就是“石头-布-石头-剪刀-蜥蜴人-斯波克-石头-布-石头-剪刀-蜥蜴人-斯波克-……”,而如果小B以“剪刀-石头-布-斯波克-蜥蜴人”长度为5的周期出拳,那么他出拳的序列就是“剪刀-石头-布-斯波克-蜥蜴人-剪刀-石头-布-斯波克-蜥蜴人-……”已知小A和小B一共进行N次猜拳。
每一次赢的人得1分,输的得0分;平局两人都得0分。
现请你统计N次猜拳结束之后两人的得分。
【输入】输入文件名为rps.in。
第一行包含三个整数:N,NA,NB,分别表示共进行N次猜拳、小A出拳的周期长度,小B出拳的周期长度。
数与数之间以一个空格分隔。
第二行包含NA个整数,表示小A出拳的规律,第三行包含NB个整数,表示小B出拳的规律。
其中,0表示“剪刀”,1表示“石头”,2表示“布”,3表示“蜥蜴人”, 4表示“斯波克”。
数与数之间以一个空格分隔。
【输出】输出文件名为rps.out。
输出一行,包含两个整数,以一个空格分隔,分别表示小A、小B的得分。
【输入输出样例1】rps.in rps.out10 5 66 20 1 2 3 40 3 4 2 1 0【输入输出样例2】rps.in rps.out4 49 5 50 1 2 3 41 0 32 4【数据说明】对于100%的数据,0 < N ≤ 200,0 < NA ≤ 200, 0 < NB ≤ 200。
NOIP2021提高组复赛试题
CCF全国信息学奥林匹克联赛(NOIP2021)复赛提高组 day11.生活大爆炸版石头剪子布(rps.cpp/c/pas)【问题描述】石头剪子布是常见的猜拳游戏:石头胜剪子,剪子胜布,布胜石头。
若是两个人出拳一样,那么不分输赢。
在《生活大爆炸》第二季第8集中显现了一种石头剪子布的升级版游戏。
升级版游戏在传统的石头剪子布游戏的基础上,增加了两个新手势:斯波克:《星际迷航》主角之一。
蜥蜴人:《星际迷航》中的反面角色。
这五种手势的输赢关系如表一所示,表中列出的是甲对乙的游戏结果。
表一石头剪子布升级版输赢关系此刻,小A和小B尝试玩这种升级版的猜拳游戏。
已知他们的出拳都是有周期性规律的,但周期长度不必然相等。
例如:若是小A以“石头-布-石头-剪子-蜥蜴人-斯波克”长度为6的周期出拳,那么他的出拳序列确实是“石头-布-石头-剪子-蜥蜴人-斯波克-石头-布-石头-剪子-蜥蜴人-斯波克-……”,而若是小B以“剪子-石头-布-斯波克-蜥蜴人”长度为5的周期出拳,那么他出拳的序列确实是“剪子-石头-布-斯波克-蜥蜴人-剪子-石头-布-斯波克-蜥蜴人-……”已知小A和小B一共进行N次猜拳。
每一次赢的人得1分,输的得0分;平局两人都得0分。
现请你统计N次猜拳终止以后两人的得分。
【输入】输入文件名为rps.in。
第一行包括三个整数:N,NA,NB,分别表示共进行N次猜拳、小A出拳的周期长度,小B出拳的周期长度。
数与数之间以一个空格分隔。
第二行包括NA个整数,表示小A出拳的规律,第三行包括NB个整数,表示小B出拳的规律。
其中,0表示“剪子”,1表示“石头”,2表示“布”,3表示“蜥蜴人”, 4表示“斯波克”。
数与数之间以一个空格分隔。
【输出】输出文件名为rps.out。
输出一行,包括两个整数,以一个空格分隔,别离表示小A、小B的得分。
【输入输出样例1】【输入输出样例2】【数听说明】关于100%的数据,0 < N ≤ 200,0 < NA ≤ 200, 0 < NB ≤ 200。
NOIP2014提高组第一试题解
NOIP2014提高组第一试题解【第一题】石头剪刀布rps【题目大意】a和b石头剪刀布游戏,每个人一共有五种方式,相互之间的胜负关系给出,a和b出拳的方式是循环的,赢者得一份,其余不得分。
问n轮以后a和b的得分。
纯粹的模拟题,把胜负关系打表或者case出来即可。
1.#include <iostream>2.#include <cstdio>3.#include <cstdlib>4.ing namespace std;6.const int win[5][5] = {7. 0,0,1,1,0,8. 1,0,0,1,0,9. 0,1,0,0,1,10. 0,0,1,0,1,11. 1,1,0,0,012. };13.int a[205], b[205];14.int main()15.{16. freopen("rps.in","r",stdin);17. freopen("rps.out","w",stdout);18.int n, na, nb;19. cin>>n>>na>>nb;20.for (int i = 0; i < na; ++i) cin>> a[i];21.for (int i = 0; i < nb; ++i) cin>> b[i];22.int i = 0, j = 0;23.int ascore = 0, bscore = 0;24.while (n) {25. ascore += win[a[i]][b[j]];26. bscore += win[b[j]][a[i]];27. i = (i + 1) % na;28. j = (j + 1) % nb;29. n --;30. }31. cout << ascore << " "<< bscore<<endl;32.return 0;33.}【第二题】联合权值link给出n个点,n-1条件的图,每个点均有点权值w[i],如果i和j距离为2,那么他们会产生w[i] * w[j]的值,求问产生值中的最大值和产生值得总和。
noi寒假刷题之旅_1.7编程基础之字符串(35题)
noi寒假刷题之旅_1.7编程基础之字符串(35题)»(35题)01:统计数字字符个数#include<iostream>#include<string>using namespace std;int main(){string a;getline(cin,a);int count=0;for(int i=0;i<a.length();++i){if('0'<=a[i]&&a[i]<='9')count++;}cout<<count;return 0;}02:找第⼀个只出现⼀次的字符#include<iostream>#include<string>using namespace std;int num[26]={};int main(){string a;cin>>a;int flag=1;int c=a.length();for(int i=0;i<c;++i){num[a[i]-'a']++;}for(int j=0;j<c;++j){if(num[a[j]-'a']==1){flag=0;printf("%c",a[j]);break;}}if(flag){cout<<"no";}return 0;}03:基因相关性#include<iostream>#include<string>using namespace std;int num[26]={};int main(){double flag;cin>>flag;string one;cin>>one;string two;cin>>two;int len=one.length();double same=0;for(int i=0;i<len;++i){if(one[i]==two[i])same++;}if((same/len)<flag){cout<<"no";}else{cout<<"yes";}return 0;}04:⽯头剪⼦布#include<iostream>#include<string>using namespace std;int num[26]={};int Result(string one,string two){if((one=="Scissors"&&two=="Paper")||(one=="Paper"&&two=="Rock")||(one=="Rock"&&two=="Scissors"))return 0;}else{return 2;}}int main(){int n;cin>>n;string one;string two;for(int i=0;i<n;++i){cin>>one>>two;int c=Result(one,two);if(c==1){cout<<"Player1\n";}else if(c==2){cout<<"Player2\n";}else{cout<<"Tie\n";}}return 0;}05:输出亲朋字符串#include<iostream>#include<string>using namespace std;int main(){string s1;getline(cin,s1);string s2="";for(int i=0;i<s1.length()-1;++i){int t1=s1[i];int t2=s1[i+1];char t3=t1+t2;s2+=t3;}int r=(int)s1[s1.length()-1]+(int)s1[0];s2+=(char)r;cout<<s2<<endl;return 0;}/*WA了两发,忘记了有可能输⼊带空格这种条件*/06:合法 C 标识符#include<iostream>#include<string>using namespace std;bool One(string a){string table[]={ "auto","break","case","char", "const","continue","default","do", "double","else","enum","extern", "float","for","goto","if", "int","long","return","short", "signed","sizeof","static","struct", "switch","typedef","union","unsigned", "void","volatile","while" };for(int i=0;i<31;++i){if(table[i]==a){return false;}}return true;}bool Two(string a){for(int i=0;i<a.length();++i){}}return true;}bool Three(string a){if('0'<=a[0]&&a[0]<='9'){return false;}else{return true;}}int main(){string c;getline(cin,c);if(One(c)&&Two(c)&&Three(c)) {cout<<"yes";}else{cout<<"no";}return 0;}07:配对碱基链#include<iostream>#include<string>using namespace std;int main(){string c;string d="";getline(cin,c);for(int i=0;i<c.length();++i){switch(c[i]){case 'A':d+='T';break;case 'T':d+='A';break;case 'G':d+='C';break;case 'C':d+='G';break;}}cout<<d;return 0;}08:字符替换#include<iostream>#include<string>using namespace std;int main(){string c;cin>>c;string d="";char ty;cin>>ty;char th;cin>>th;for(int i=0;i<c.length();++i){if(c[i]==ty)c[i]=th;}cout<<c;return 0;}09:密码翻译#include<iostream>#include<string>using namespace std;int main(){string c;getline(cin,c);for(int i=0;i<c.length();++i){if('a'<=c[i]&&c[i]<='z'){c[i]=(c[i]+1-'a')%26+'a';return 0;}10:简单密码#include<iostream>#include<string>using namespace std;int main(){string c;getline(cin,c);char t2[26]={'V', 'W', 'X', 'Y', 'Z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U'}; for(int i=0;i<c.length();++i){if('A'<=c[i]&&c[i]<='Z'){c[i]=t2[c[i]-'A'];}}cout<<c;return 0;}11:潜伏者#include<iostream>#include<string>using namespace std;char t[26];int s[26];int main(){string c="";string bc="";string r="";int flag=0;getline(cin,c);getline(cin,bc);getline(cin,r);for(int i=0;i<bc.length();++i){s[bc[i]-'A']++;if(t[c[i]-'A']&&t[c[i]-'A']!=bc[i]){flag=1;break;}t[c[i]-'A']=bc[i];}for(int i=0;i<26;++i){if(s[i]==0){flag=1;}}if(flag){cout<<"Failed";return 0;}for(int i=0;i<r.length();++i){r[i]=t[r[i]-'A'];}cout<<r;return 0;}12:加密的病历单#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){string c="";int flag=0;getline(cin,c);c[i]=(c[i]-'a'+3+26)%26+'A';}else if('A'<=c[i]&&c[i]<='Z'){c[i]=(c[i]-'A'+3+26)%26+'a';}}reverse(c.begin(),c.end());cout<<c;return 0;}13:将字符串中的⼩写字母转换成⼤写字母#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){string c="";getline(cin,c);for(int i=0;i<c.length();++i){if('a'<=c[i]&&c[i]<='z'){c[i]=(c[i]-'a'+26)%26+'A';}}cout<<c;return 0;}14:⼤⼩写字母互换#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){string c="";getline(cin,c);for(int i=0;i<c.length();++i){if('a'<=c[i]&&c[i]<='z'){c[i]=(c[i]-'a'+26)%26+'A';}else if('A'<=c[i]&&c[i]<='Z'){c[i]=(c[i]-'A'+26)%26+'a';}}cout<<c;return 0;}15:整理药名#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){int n;cin>>n;string c;for(int i=0;i<n;++i){cin>>c;if('a'<=c[0]&&c[0]<='z'){c[0]=(c[0]-'a'+26)%26+'A';}for(int j=1;j<c.length();++j){if('A'<=c[j]&&c[j]<='Z'){c[j]=(c[j]-'A'+26)%26+'a';}}cout<<c<<endl;}return 0;}16:忽略⼤⼩写的字符串⽐较#include<iostream>using namespace std;int main(){string c;string b;getline(cin,c);getline(cin,b);for(int i=0;i<c.length();++i) {if('a'<=c[i]&&c[i]<='z'){c[i]=(c[i]-'a'+26)%26+'A'; }}for(int i=0;i<b.length();++i) {if('a'<=b[i]&&b[i]<='z'){b[i]=(b[i]-'a'+26)%26+'A'; }}int ptr=pare(b);if(ptr>0){cout<<">";}else if(ptr<0){cout<<"<";}else{cout<<"=";}return 0;}17:字符串判等#include<iostream>#include<string>#include<string.h>#include<stdio.h>#include<algorithm> using namespace std;int main(){string c;string b;string d;string e;getline(cin,c);getline(cin,b);for(int i=0;i<c.length();++i) {if('a'<=c[i]&&c[i]<='z'){c[i]=(c[i]-'a'+26)%26+'A'; }if(c[i]!=' ')d+=c[i];}for(int i=0;i<b.length();++i) {if('a'<=b[i]&&b[i]<='z'){b[i]=(b[i]-'a'+26)%26+'A'; }if(b[i]!=' ')e+=b[i];}int ptr=pare(d);if(ptr==0){cout<<"YES";}else{cout<<"NO";}return 0;}18:验证⼦串#include<iostream> using namespace std;int main()getline(cin,b);if(a.length()>b.length()){max=a;min=b;}else{max=b;min=a;}int j=0;int i=0;for(;j<min.length()&&i<max.length();++i){// cout<<i<<"_"<<max[i]<<"::"<<j<<"_"<<min[j]<<endl; if(min[j]==max[i]){j++;}else{j=0;}}if(j==min.length()){cout<<min<<" is substring of "<<max;}else{cout<<"No substring";}return 0;}19:字符串移位包含问题#include<iostream>using namespace std;int main(){string a,b,c="";string max,min;cin>>max>>min;if(max.length()>min.length()){a=max;b=min;}else{a=min;b=max;}int len=a.length();for(int i=1;i<len;++i){c=a.substr(i)+a.substr(0,i);if(c.find(b)!=string::npos){cout<<"true";return 0;}// cout<<c<<endl;}if(a.find(b)!=string::npos){cout<<"true";}else{cout<<"false";}return 0;}20:删除单词后缀【字符串饭庄+字符串查找】#include<iostream>using namespace std;int main(){string a,b[3]={"er","ly"};string max,min;cin>>a;if(a.length()>2)}else{for(int i=0;i<2;++i){string::size_type pos=a.find(b[i]);if(pos!=string::npos){a=a.substr(0,a.length()-2);break;}}}}cout<<a;return 0;}21:单词替换#include<iostream>#include<string>using namespace std;int main(){string a,b,c;getline(cin,a);getline(cin,b);getline(cin,c);int fk=0;while(1){string::size_type pos=a.find(b,fk++);if(pos!=string::npos){if(pos==0&&a[b.length()]==' ' ||pos==a.length()-b.length()&&a[pos-1]==' '||pos>0&&a[pos-1]==' '&&a[pos+b.length()]==' ') a=a.substr(0,pos)+c+a.substr(pos+b.length()); }else{break;}}cout<<a;return 0;}22:紧急措施#include<iostream>#include<string>using namespace std;int main(){string my;string name,pass,email;int n,fk=1;cin>>my>>n;for(int i=0;i<n;++i){cin>>name>>pass>>email;if(email==my){fk=0;for(int j=0;j<pass.length();++j){if('a'<=pass[j]&&pass[j]<='z'){pass[j]-=('a'-'A');}else if('A'<=pass[j]&&pass[j]<='Z'){pass[j]+=('a'-'A');}}cout<<name<<" "<<pass<<endl;}}if(fk){cout<<"empty";}return 0;}{string str;string re="";while(cin>>str){re+=str+' ';}re=re.substr(0,re.length()-1);cout<<re;return 0;}24:单词的长度#include<iostream>#include<string>#include<string.h>using namespace std;int main(){string str;string re="";while(cin>>str){re+=to_string(str.length())+',';}re=re.substr(0,re.length()-1);cout<<re;return 0;}25:最长最短单词#include<iostream>#include<string>#include<string.h>using namespace std;int main(){string str;int maxl,minl;string max,min;minl=20000;maxl=0;while(cin>>str){if(str.length()>maxl){max=str;maxl=str.length();}if(str.length()<minl){min=str;minl=str.length();}}cout<<max<<endl<<min;return 0;}26:字符串最⼤跨距#include<iostream>#include<string>#include<string.h>using namespace std;int main(){string s,s1,s2,s3;cin>>s;s1 = s.substr(0,s.find(','));s2 = s.substr(s.find_first_of(',')+1,s.find_last_of(',')-s.find_first_of(',')-1); s3 = s.substr(s.find_last_of(',')+1);string::size_type a=s1.find(s2);string::size_type b=s1.find(s3);int c=-1;if((a!=string::npos)&&(b!=string::npos)&&(a<b)&&(a+s2.length()<=b)) {c=s1.rfind(s3)-s2.length()-a;}cout<<c;return 0;}27:单词翻转#include<iostream>#include<string>#include<algorithm>s+=" ";for(int i=0;i<s.length();++i){if(s[i]!=' '){s1+=s[i];}else{reverse(s1.begin(),s1.end());s=s.substr(0,i-s1.length())+s1+s.substr(i);s1="";}}s=s.substr(0,s.length()-1);cout<<s;return 0;}28:单词倒排#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){string s="",s1="";while(cin>>s1){s=s1+" "+s;}s=s.substr(0,s.length()-1);cout<<s;return 0;}⽣化危机开始,只好在家敲敲代码了【托腮】29:ISBN号码#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){string s1="";char code;int d=0,j=1;cin>>s1;for(int i=0;i<s1.length()-2;++i){if(s1[i]!='-'){d=d+(s1[i]-'0')*j;j++;}}d%=11;if(d==10){code='X';}else{code=d+'0';}if(code==s1[s1.length()-1]){cout<<"Right";}else{cout<<s1.substr(0,s1.length()-1)+code;}return 0;}30:字符环【造环】#include<iostream>#include<string>#include<algorithm>using namespace std;int main()int le2=s2.length();s1+=s1;s2+=s2;b=min(le1,le2);for(int i=0;i<le1;++i){for(int j=0;j<le2;++j){re=0;//限制长度//更改起始点来模拟环for(int t1=i,t2=j;s1[t1]==s2[t2]&&re<b;t1++,t2++)re++; if(re>a)a=re;}}cout<<a;return 0;}31:字符串p型编码#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){string s="",p="";int re[10]={},index=1;cin>>s;for(int i=0;i<s.length();++i){if(s[i]==s[i+1]){index++;}else{cout<<to_string(index)<<s[i];index=1;}}return 0;}32:⾏程长度编码#include<iostream>#include<string>#include<algorithm>using namespace std;int main(){string s="",p="";int re[10]={},index=1;cin>>s;//⼤⼩写处理for(int i=0;i<s.length();++i){if('a'<=s[i]&&s[i]<='z')s[i]-=('a'-'A');}for(int i=0;i<s.length();++i){if(s[i]==s[i+1]){index++;}else{cout<<"("<<s[i]<<","<<index<<")";index=1;}}return 0;}33:判断字符串是否为回⽂#include<iostream>#include<string>#include<algorithm>#include<stack>using namespace std;int main(){string s="",p="";int re[10]={},index=1;cin>>s;stack<char> S;int i=0,flag=0;for(;i<s.length()/2;++i) S.push(s[i]);if(s.length()%2)++i;{if(S.top()!=s[i]){flag=1;break;}else{S.pop();}}if(flag){cout<<"no";}else{cout<<"yes";}return 0;}34:回⽂⼦串#include<iostream>#include<string>#include<algorithm>#include<stack>using namespace std;int main(){string s="",p="";int re[10]={},index=1,flag=0;cin>>s;for(int i=2;i<=s.length();++i){for(int j=0;j<=s.length()-i;++j){string t=s.substr(j,i);flag=0;for(int k=0;k<t.length()/2;++k){if(t[k]!=t[t.length()-k-1]){flag=1;break;}}if(!flag){cout<<t<<endl;}}}return 0;}#include<cstdio>char a[300],d,e,f,j,p;int main(){int p1,p2,p3,i=0,k;scanf("%d%d%d%s",&p1,&p2,&p3,a);for(;a[i];i++){d=a[i-1],e=a[i+1],f=a[i];if(f=='-'&&e>d&&(d>='0'&&e<='9'||d>='a'&&e<='z')){for(p3==1?j=d+1:j=e-1;p3==1?j<e:j>d;p3==1?j++:j-- {p=j;if(p1==2)p=(p>='a')?p-32:p;else if(p1==3) p='*';for(k=0;k<p2;k++)printf("%c",p);}}elseprintf("%c",f);}return 0;}。
信息学奥赛NOIP贪心
最优子结构:当一个问题的最优解包含其子问 题的最优解时,称此问题具有最优子结构性质。
【引例2】金银岛(noip-openjudge 4.6算法之贪心)
某天 KID 利用飞行器飞到了一个金银岛上,上面有许 多珍贵的金属, KID 虽然更喜欢各种宝石的艺术品,可是 也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋 至多只能装重量为w的物品。岛上金属有s个种类, 每种金 属重量不同,分别为n1, n2, ... , ns,同时每个种类的 金属总的价值也不同,分别为 v1,v2, ..., vs 。 KID 想一 次带走价值尽可能多的金属,问他最多能带走价值多少的 金属。注意到金属是可以被任意分割的,并且金属的价值 和其重量成正比。
1 2 3 4 5
A
起点 S 疲劳值
1
1 1
2
2 2
3
3 3
4
4 4
5
5
【输入样例1】
【输出样例1】
15 19 22 24 25
5
1 2 3 4 5
1 2 3 4 5
A
起点 S 疲劳值
1
1 1
2
2 2
3
3 3
4
4
5
5
【输入样例1】
【输出样例1】
15 19 22 24 25
5
1 2 3 4 5
1 2 3 4 5
【分析】 有以下几种策略可供选择: (1 )每次挑选价值最大的物品装入背包,得到的结果是 否最优?
(2 )每次挑选所占重量最小的物品装入是否能得到最优 解?
(3)每次选取单位重量价值最大的物品。
解题一般步骤: 1、设计数据找规律; 2、进行贪心猜想; 3、正确性证明(严格证明和一般证明) ★一般证明:列举反例; ★严格证明:数学归纳和反证法; 4、程序实现。
Python程序设计:猜拳游戏(案例)
步骤:任务实施
任务 猜拳游戏
设计思路
该游戏需要记录胜、负、平的情况,因此需要初始化一些变量来记录胜、负的局数。 游戏不可能只玩一局,因此需要在循环里面编写玩游戏的逻辑,由于循环结束的标志不太
好确定,可以考虑使用死循环,然后通过输入某些标志,比如输入q以退出游戏。 需要通过生成随机数,以表示庄家出拳,玩家出拳则通过键盘进行录入。 比较庄家和玩家的出拳情况,看谁获胜,根据获胜情况,对记录胜负情况的变量进行刷新,
猜拳游戏
任务 猜拳游戏
任务背景
本任务需要完成猜拳游戏,并在游戏结束后统计胜负情况,涉及的知 识点是Python中的条件选择结构。我们将从猜拳游戏需求出发,系统 的学习条件选择结构的各种用法,包括单分支结构、双分支结构、多 分支结构、选择结构的嵌套等。
任务 猜拳游戏
任务目标
掌握条件控制语句单分支结构的用法。 掌握条件控制语句双分支结构的用法。 掌握条件控制语句多分支结构的用法。 掌握条件控制语句的嵌套使用。 掌握通过随机数模块random生成随机数的方法。
谢谢观看
步骤:任务分析
任务 猜拳游戏
需求分析
猜拳游戏,又名“剪刀、石头、布”,古老而简单,这个游戏的主要目的是为了解决争议, 因为三者相互制约,因此不论平局几次,总会有胜负的时候。游戏规则中,石头克剪刀, 剪刀克布,布克石头。
请编写一个程序,模拟猜拳游戏,由玩家和庄家进行对弈,庄家可由系统扮演,每次让玩 家选择出拳,然后和系统出拳进行比较,得出输赢结果。玩家可以自由选择玩的局数,在 猜拳游戏结束后打印玩家和庄家各自获胜的局数。
并打印相应的胜负提示。 游戏结束后,统计玩家和庄家的获胜情况,并
知识点 if语句 if语句嵌套
主要思路 初始化一些变量来记录胜、负的局数。 循环结束的标志不太好确定,使用死循环,然后通过输入q标志,退出游戏。 通过生成随机数,表示庄家出拳,通过键盘进行录入玩家出拳。 根据获胜情况,对记录胜负情况的变量进行刷新,并打印相应的胜负提示。 游戏结束后,统计玩家和庄家的获胜情况,并打印出来。
NOIP辅导-贪心法——修改
我们来看一个找硬币的例子。假设有四种硬币,它们的面值分别为 二角五分、一角、五分和一分。现在要找给某顾客六角三分钱。这时, 我们会不假思索地拿出2个二角五分的硬币,1个一角的硬币和3个一分 的硬币交给顾客。这种找硬币方法与其他的找法相比,所拿出的硬币个 数是最少的。这里,我们下意识地使用了这样的找硬币算法:首先选出 一个面值不超过六角三分的最大硬币,即二角五分;然后从六角三分中 减去二角五分,剩下三角八分;再选出一个面值不超过三角八分的最大 硬币,即又一个二角五分,如此一直做下去。这个找硬币的方法实际上 就是贪心算法。
思路: 消耗最少体力的方法就是每次合并的总是果子最少的两堆。 (类比:哈夫曼树)
纪念品分组【NOIP2007普及组】 Description
元旦快到了,校学生会让乐乐负责新年晚会的纪念 品发放工作。为使得参加 晚会的同学所获得的纪念品价值相对均衡,他要把购来 的纪念品根据价格进行分组,但每组最多只能包括两件 纪念品,并且每组纪念品的价格之和不能超过一个给定 的整数。为了保证在尽量短的时间内发完所有纪念品, 乐乐希望分组的数目最少。
NOIP复赛辅导-贪心法
2012-09
贪心法
贪心算法通过一系列的选择来得到一个问题的解。它所 作的每一个选择都是当前状态下某种意义的最好选择,即 贪心选择。贪心算法以尽可能快地求得满意解的方法, 省去 了为查找最优解而去穷尽所有可能而耗费的大量时间。
希望通过每次所作的贪心选择导致最终结果是问题的一 个最优解。这种贪心选择的策略并不总能奏效,然而在许 多情况下确能达到预期的目的。
s个数字后剩下的数字按原左右次序将组成一个正整数编程对给定 的n和s,寻找一种方案,使得剩下的数字组成的新数最8543 4 样例输出: 13
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P1019 石头剪子布
题目描述
现在有两个人在玩石头剪子布游戏,请你判断最后谁赢了。
用R代表石头,S代表剪子,P代表布。
输入
输入的第一行是一个整数t(0<t<1000),表示测试样例的数目。
每组输入样例的第一行是一个整数n(0<n<100),表示游戏次数。
接下来n行,每行由两个字母组成,两个字母之间用一个空格分隔,这些字母只会是R,S 或P。
第一个字母表示Player1的选择,第二个字母表示Player2的选择。
输出
对于每组输入样例,输出获胜方的名字(Player1或Player2),如果平均,则输出TIE。
样例输入
3
2
R P
S R
3
P P
R S
S R
1
P R
样例输出
Player 2
TIE
Player 1
P水库(递归)
题目描述
【问题描述】
西南有一个水水库!由于干旱出现了!每天抽水救灾100吨,水库每天自然出水30吨!这样过了n天后,水库还有s吨水!!问水库在干旱出现前有多少吨水?
【输入格式】
2个正整数
【输出格式】
一个正整数
【输入样例】
12 1
【输出样例】
841
【数据规模】
3<=N<=40
0<=S<=100
【时间限制】
1S
P5162 Greedy Gift Givers贪婪的送礼者
题目描述
1.1.2 Greedy Gift Givers贪婪的送礼者
(gift1.pas/c/cpp)
题目描述
对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少。
在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。
然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。
给出一群朋友,没有人的名字会长于14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表,请确定每个人收到的比送出的钱多的数目。
输入格式(gift1.in)
第1 行: 人数NP,2<= NP<=10
,
第2 行到第NP+1 行:这NP个在组里人的名字一个名字一行
,
第NP+2到最后:
,
这里的I段内容是这样组织的:
,
第一行是将会送出礼物人的名字。
,
第二行包含二个数字:第一个是原有的钱的数目(在0到2000的范围里),第二个NG i是将收到这个人礼物的人的个数如果NG i是非零的, 在下面NG i行列出礼物的接受者的名字,一个名字一行。
,
输出格式(gift1.out)
输出NP 行
每行是一个的名字加上空格再加上收到的比送出的钱多的数目。
对于每一个人,他名字的打印顺序应和他在输入的2到NP+1行中输入的顺序相同。
所有的送礼的钱都是整数。
每个人把相同数目的钱给每位要接受礼物的朋友,而且尽可能多给,不能给出的钱由送礼者本人持有。
样例输入
5
dave
laura
owen
vick
amr
dave
200 3 laura owen
vick owen
500 1 dave
amr
150 2 vick owen laura
0 2
amr
vick
vick
0 0
样例输出dave 302 laura 66 owen -359 vick 141 amr -150
参考程序:
program p1019;
var
t,n,i,r,sum1,sum2:longint;
a,b,tmp:char;
function pd(p1,p2:char):integer; begin
if p1=p2 then
pd:=0
else
begin
if (p1='R') and (p2='S') or
(p1='S') and (p2='P') or
(p1='P') and (p2='R') then
pd:=1
else
pd:=2;
end;
end;
begin
readln(t);
while(t>0) do
begin
dec(t);
readln(n);
sum1:=0;
sum2:=0;
for i:=1 to n do
begin
readln(a,tmp,b);
r:=pd(a,b);
if r=1 then inc(sum1);
if r=2 then inc(sum2);
end;
if sum1>sum2 then
writeln('Player 1')
else if sum1<sum2 then
writeln('Player 2')
else
writeln('TIE')
end;
end.
program p25485;
var
y,n,s:longint;
function dg(x:longint):longint; begin
if x=n+1 then
dg:=s
else
dg:=dg(x+1)+70;
end;
begin
readln(n,s);
writeln(dg(1));
end.。