【NOIp】NOIp2008

【NOIp】NOIp2008NOIp2008T1笨小猴标签:STL用一个map存字母到数字(出现次数)的映射由于数据范围很小,可以不用线性筛直接${\sqrt{n}}$即可code1#include<bi

大家好,又见面了,我是你们的朋友全栈君。

NOIp2008

T1 笨小猴

标签:STL

用一个map存字母到数字(出现次数)的映射

由于数据范围很小,可以不用线性筛直接${\sqrt{n}}$即可

code

<span role="heading" aria-level="2">【NOIp】NOIp2008
<span role="heading" aria-level="2">【NOIp】NOIp2008

 1 #include <bits/stdc++.h>  2 using namespace std;  3 namespace gengyf{  4 inline int read(){  5 int x=0,f=1;char s=getchar();  6 while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}  7 while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}  8 return x*f;  9  } 10 int maxx,minn=999;char word[101]; 11 map<char,int>m; 12 bool prime(int x){ 13 for(int i=2;i<=sqrt(x);i++){ 14 if(x%i==0){ 15 return 0; 16  } 17  } 18 return 1; 19  } 20 int main(){ 21 cin>>word; 22 int l=strlen(word); 23 for(int i=0;i<l;i++){ 24 m[word[i]]++; 25 maxx=max(maxx,m[word[i]]); 26  } 27 for(int i=0;i<l;i++){ 28 minn=min(minn,m[word[i]]); 29  } 30 if(maxx==0||maxx==1){ 31 printf("No Answer\n"); 32 return 0; 33  } 34 if(maxx-minn==1||maxx-minn==0){ 35 printf("No Answer\n0"); 36 return 0; 37  } 38 if(prime(maxx-minn)){ 39 printf("Lucky Word\n"); 40 printf("%d\n",maxx-minn); 41  } 42 else { 43 printf("No Answer\n0"); 44  } 45 return 0; 46  } 47 } 48 int main(){ 49  gengyf::main(); 50 return 0; 51 }

T1

 我觉得我就是个笨小猴,minn忘赋初值WA了一次,没特判1又WA了一次,太zz

T2 火柴棒等式

标签:没有标签

直接枚举i,j从1到最大值,如果组成i,j,i+j的火柴棒总数恰好等于n-4统计答案+1

这道题唯一可说的就是怎么找最大值,因为现在还不知道最大值,所以枚举的范围要稍微开大一点(1e3,1e4这种

然后把n从1到24跑一遍,记录下i,j的最大值maxx,再用maxx替换掉刚才的范围最大值

code

<span role="heading" aria-level="2">【NOIp】NOIp2008
<span role="heading" aria-level="2">【NOIp】NOIp2008

 1 #include <bits/stdc++.h>  2 using namespace std;  3 namespace gengyf{  4 inline int read(){  5 int x=0,f=1;char s=getchar();  6 while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}  7 while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}  8 return x*f;  9  } 10 int n,s[10]={6,2,5,5,4,5,6,3,7,6},ans; 11 int match(int x){ 12 int tmp=0; 13 if(x<10)return s[x]; 14 while(x!=0){ 15 int xx=x%10; 16 tmp+=s[xx]; 17 x/=10; 18  } 19 return tmp; 20  } 21 int main(){ 22 n=read(); 23 for(int i=0;i<=999;i++) 24 for(int j=0;j<=999;j++){ 25 int k=i+j; 26 if(match(i)+match(j)+match(k)==n-4){ 27 ans++; 28  } 29  } 30 printf("%d",ans); 31 return 0; 32  } 33 } 34 int main(){ 35  gengyf::main(); 36 return 0; 37 }

T2

求最大值code

<span role="heading" aria-level="2">【NOIp】NOIp2008
<span role="heading" aria-level="2">【NOIp】NOIp2008

 1 #include <bits/stdc++.h>  2 using namespace std;  3 namespace gengyf{  4 inline int read(){  5 int x=0,f=1;char s=getchar();  6 while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}  7 while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}  8 return x*f;  9  } 10 int n,s[10]={6,2,5,5,4,5,6,3,7,6},ans,maxx=0; 11 int match(int x){ 12 int tmp=0; 13 if(x<10)return s[x]; 14 while(x!=0){ 15 int xx=x%10; 16 tmp+=s[xx]; 17 x/=10; 18  } 19 return tmp; 20  } 21 int main(){ 22 n=read();//输入n为0 23 while(n!=25){ 24 n++; 25 for(int i=0;i<=999;i++) 26 for(int j=0;j<=999;j++){ 27 int k=i+j; 28 if(match(i)+match(j)+match(k)==n-4){ 29 maxx=max(maxx,max(i,j)); 30 ans++; 31  } 32  } 33  } 34 printf("%d",maxx); 35 return 0; 36  } 37 } 38 int main(){ 39  gengyf::main(); 40 return 0; 41 }

Max

另附:搜索题解

T3 传纸条

标签:dp

把两张纸条看成都从左上传下来

3维的转移比较好想

情况只有四种:

第一张从上边来,第二张从上边来

第一张从上边来,第二张从左边来

第一张从左边来,第二张从上边来

第一张从左边来,第二张从左边来

f[i][j][k]表示现在位置的横纵坐标之和为i,第一张的纵坐标为j,第二张的纵坐标为k

所以方程为

第一张从上边来,第二张从上边来 f(i,j,k)=max{f(i,j,k),f(i-1,j-1,k-1)+a[j][i-j]+a[k][i-k]}

第一张从上边来,第二张从左边来 f(i,j,k)=max{f(i,j,k),f(i-1,j-1,k)+a[j][i-j]+a[k][i-k]}

第一张从左边来,第二张从上边来 f(i,j,k)=max{f(i,j,k),f(i-1,j,k-1)+a[j][i-j]+a[k][i-k]}

第一张从左边来,第二张从左边来 f(i,j,k)=max{f(i,j,k),f(i-1,j,k)+a[j][i-j]+a[k][i-k]}

但是!它不够优秀!

我们使用滚动数组

可以发现i只会由i-1转移过来,所以可以把第一维省去

j,k都是从更小j,k的转移而来,所以将j,k倒序枚举防止在转移前被修改

code

<span role="heading" aria-level="2">【NOIp】NOIp2008
<span role="heading" aria-level="2">【NOIp】NOIp2008

 1 #include<cstdio>  2 #include<algorithm>  3 using namespace std;  4 int f[201][201],a[201][201];  5 int maxx(int a,int b,int c,int d){  6 if(a<b)a=b;  7 if(c>a)a=c;  8 if(d>a)a=d;  9 return a; 10 } 11 int main(){ 12 int n,m; 13 scanf("%d%d",&n,&m); 14 for(int i=1;i<=n;i++) 15 for(int j=1;j<=m;j++){ 16 scanf("%d",&a[i][j]); 17  } 18 f[1][2]=a[1][2]+a[2][1]; 19 for(int k=4;k<n+m;++k) 20 for(int i=n;i>0;--i) 21 for(int j=n;j>i;--j){ 22 f[i][j]=maxx(f[i][j],f[i-1][j-1],f[i-1][j],f[i][j-1])+a[i][k-i]+a[j][k-j]; 23 if(i==j)f[i][j]-=a[i][k-i]; 24  } 25 int ans=0; 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=n;j++){ 28 ans=max(f[i][j],ans); 29  } 30 printf("%d\n",f[n-1][n]); 31 return 0; 32 }

T3

早期代码~

附:大教室中传纸条(数据加强版)

T4 双栈排序

标签:图论,贪心,dp

先跑一遍dp判断那些不能在同一个栈里

我们发现如果有三个位置i,j,k满足i<j<k且a[k]<a[i]<a[j]是不可行的显然

再将不能共存的i,j连边,进行二分图染色,如果不能染说明不存在可行解

又因为要求字典序最小,所以尽量先放S1

code

 

<span role="heading" aria-level="2">【NOIp】NOIp2008
<span role="heading" aria-level="2">【NOIp】NOIp2008

 1 #include <bits/stdc++.h>  2 using namespace std;  3 namespace gengyf{  4 inline int read(){  5 int x=0,f=1;char s=getchar();  6 while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}  7 while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}  8 return x*f;  9  } 10 int f[1010],n,a[1010],color[1010]; 11 struct edge{ 12 int nxt,to; 13 }e[1010]; 14 int head[1010],cnt,s1[1010],s2[1010]; 15 void add(int from,int to){ 16 e[++cnt].to=to;e[cnt].nxt=head[from]; 17 head[from]=cnt; 18  } 19 bool dfs(int u,int c){ 20 color[u]=c; 21 for(int i=head[u];i;i=e[i].nxt){ 22 int to=e[i].to; 23 if(color[to]==color[u])return false; 24 if(!color[to]&&!dfs(to,3-c))return false; 25  } 26 return true; 27  } 28 int main(){ 29 n=read(); 30 for(int i=1;i<=n;i++){ 31 a[i]=read(); 32  } 33 f[n]=a[n]; 34 for(int i=n-1;i>=1;i--){ 35 f[i]=min(f[i+1],a[i]); 36  } 37 for(int i=1;i<=n;i++) 38 for(int j=i+1;j<=n;j++){ 39 if(a[i]<a[j]&&f[j]<a[i]){ 40  add(i,j);add(j,i); 41  } 42  } 43 for(int i=1;i<=n;i++){ 44 if(!color[i]&&!dfs(i,1)){ 45 printf("0"); 46 return 0; 47  } 48  } 49 int c1=0,c2=0,now=1; 50 for(int i=1;i<=n;i++){ 51 if(color[i]==1){ 52 s1[++c1]=a[i];printf("a "); 53  } 54 else { 55 s2[++c2]=a[i];printf("c "); 56  } 57 while(s1[c1]==now||s2[c2]==now){ 58 if(s1[c1]==now){ 59 printf("b ");c1--; 60  } 61 else { 62 printf("d ");c2--; 63  } 64 now++; 65  } 66  } 67 return 0; 68  } 69 } 70 int main(){ 71  gengyf::main(); 72 return 0; 73 }

T4

 

这题看完之后一脸懵,想不到什么正经方法,苦死无果后看题解才恍然大悟,这告诉我们不仅要知道某一算法的应用范围,还要理解算法本质QAQ

 


 

 

<span role="heading" aria-level="2">【NOIp】NOIp2008

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154555.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • gpio引脚介绍 树莓派3b_树莓派3bgpio引脚介绍[通俗易懂]

    gpio引脚介绍 树莓派3b_树莓派3bgpio引脚介绍[通俗易懂]第4章GPIO接口本章内容:?GPIO接口时通用输入输出端口,通俗的说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚状态——是高电平还是低电平。…更强的“盒子”树莓派3B型主板性能、功能增强,带来更广泛的应用领域。树莓派3B保持了B型树莓派的外形尺寸和接口布局,而性能升级是它最大的变化,……树莓派3B系列的人脸识别实验室门禁系统朱琳,…

  • 插值算法及matlab实现,MATLAB 插值算法实现

    插值算法及matlab实现,MATLAB 插值算法实现1.高斯插值functionf=Gauss(x,y,x0)if(length(x)==length(y))n=length(x);elsedisp(‘x和y的维数不相等!’);return;endxx=linspace(x(1),x(n),(x(2)-x(1)));if(xx~=x)disp(‘节点之间不是等距的!’);return;endif(mod(n,2)==1)if…

  • CAS单点登录原理解析

    CAS单点登录原理解析推荐阅读1.SpringBoot整合篇2.手写一套迷你版HTTP服务器3.记住:永远不要在MySQL中使用UTF-84.Springboot启动原理解析1、基于Cookie的单点登录的回顾基于Cookie的单点登录核心原理:将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中取出用户名…

  • python安装pygame教程_python-pygame安装教程

    python安装pygame教程_python-pygame安装教程安装好python后,配置环境变量。安装pygame需要先配置两个环境变量。第一个是python的。先打开计算机,然后点击‘系统属性’然后点击‘高级系统设置’然后点击‘环境变量’在系统变量中找到path选择并编辑在末尾添加“;”号来作为与前面的间隔。我将python安装到了c盘的py文件夹所以我的安装目录是C:\py。(不要关闭编辑系统变量的界面,我们接着找第二个环境变量)第二个是pip的(我们…

  • 用python编写猴子吃桃问题_人工智能猴子摘香蕉

    用python编写猴子吃桃问题_人工智能猴子摘香蕉Java实现人工智能实验一,猴子摘香蕉,图形化展示

  • 视音频数据处理入门:RGB、YUV像素数据处理[通俗易懂]

    视音频数据处理入门:RGB、YUV像素数据处理[通俗易懂]有段时间没有写博客了,这两天写起博客来竟然感觉有些兴奋,仿佛找回了原来的感觉。前一阵子在梳理以前文章的时候,发现自己虽然总结了各种视音频应用程序,却还缺少一个适合无视音频背景人员学习的“最基础”的程序。因此抽时间将以前写过的代码整理成了一个小项目。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号