【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)


相关推荐

  • npm ERR! code E404 npm ERR! 404 Not Found – GET https://registry.npmjs.com/@mlamp%2fuser-info-dropdo

    npm ERR! code E404 npm ERR! 404 Not Found – GET https://registry.npmjs.com/@mlamp%2fuser-info-dropdonpmERR!codeE404npmERR!404NotFound-GEThttps://registry.npmjs.com/@mlamp%2fuser-info-dropdown-Notfound当我npminstall的时候出现这个错误原因是npm源指向的问题执行:npmconfigsetregistryhttps://registry.npmjs.org/问题的原因出现在:在Vue/react/angular框架中打包和编译时报错。使用指令为项目

    2022年10月25日
  • win10进入文件夹指令_命令行进去某个文件夹

    win10进入文件夹指令_命令行进去某个文件夹win+R-运行-cmd打开命令行窗口输入盘符:D:进入D盘命令行显示:D:\>继续输入D:\>cdD:\test进入test文件夹//在文件夹目录下,shift+鼠标右键,弹出菜单里,选择powershell,打开PowerShell框//当前,在E盘下打开的powershellE:\>//从E盘进入…

    2022年10月15日
  • Discuz 精心整理的搬家教程

    Discuz 精心整理的搬家教程由于种种原因,很多时候站长都需要对网站进行搬家,搬家会经常出现这样或那样的问题,现在对以往的经验做一个总结,希望对各位站长有所帮助。  网站的空间有独立与虚拟之分,下面分别介绍两种空间的搬家方法。  一、独立主机  网站搬家即数据的迁移,搬家前不论独立还是虚拟主机,网站都需关闭。数据的迁移分为数据库数据及程序和附件文件两部分的的迁移。  数据库的迁移:首先停止老服务器上的MySQL。复制MySQL数据存放目录下的数据文件,至于MySQL的数据存放目录,可以查看MySQL配…

  • ConstraintLayout 下 layout_marginLeft 属性无效问题[通俗易懂]

    ConstraintLayout 下 layout_marginLeft 属性无效问题[通俗易懂]ConstraintLayout下layout_marginLeft属性无效问题需要添加app:layout_constraintLeft_toLeftOf="parent&quo

  • java链表打印_java链表打印

    java链表打印_java链表打印链表类packagecom.demo;publicclassNode{privateStringdata;privateNodenext;publicNode(Stringdata){this.data=data;}publicStringgetData(){returndata;}publicvoidsetData(Stringdata){this.data…

  • 手把手教程——自制ARM仿真器Jlink-OB-072,原来这么简单

    使用的软件:AltiumDesigner使用的硬件:STM32F072C8T6全套设计资料:PCB工程;Jlink固件;Jlink驱动仿真器特点: 支持SWD模式,下载时仅需连接DIO、CLK、GND三个引脚 支持串口TTL 采用Micro_USB接口+延长线的设计,优雅的下载程序和Debug 无外置晶振,降低成本,节省空间 提供全部开发设…

发表回复

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

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