STO Ender orz 太强了        STO WK orz 太神了

首先,为什么是前两道呢?

因为最后一道是导数推论+泰勒展开,对于我一个初中生来说只能稍作理解,严格推论还是写不出

第一题 W

题目描述

给定正整数n,将其表示为n=a_1+a_2+...a_m,其中a_i的绝对值为2的非负整数幂(即a_i=1,-1,2,-2,4,-4or so)
求最小的m

输入格式

输入 一个正整数n,以二进制形式给出。

输出格式

输出 一个正整数m

思路解析:

这道题解法有二,一曰动态规划,一曰贪心

吾辈蒟蒻,只能贪心,可殿试手滑,少刻一符,曰c[i]='1'。

问如何贪心:

且观此题,一看无非两种操作,

一 :直接用2的k次方,填在第k位上

二:或者在一堆1的的前面一位填上1,再在最后一位减回。

明显第二种更优,所以在代价变小的前提下尽量向二靠拢,

如111101111

就可填上中间的0,代价会更小。

但还有一种更小:

1110101010111111

就是坑点,因为本来

101用二是不优的,可这样就变优了。

所以要特判

请看代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<cmath>
#include<vector>
using namespace std;
#define LL long long
#define M (1000005)
#define isdigit(x) ((x) >= '0' && (x) <= '9')
LL read() {LL res = 0;char c = getchar();while(!isdigit(c)) c = getchar();while(isdigit(c)) res = ((res << 1) + (res << 3) + c - 48), c = getchar();return res;
}
void write(LL x) {if(x / 10) write(x / 10);putchar(x % 10 + '0');
}
char c[M];
LL len=0,s[M],ans;
int main(){scanf("%s",c);len=strlen(c);s[0]=c[0]-'0';for(int i=1;i<len-1;i++){if(c[i-1]=='1'&&c[i+1]=='1'&c[i]=='0'&&(c[i-2]=='1'||c[i+2]=='1')){s[i]=1;c[i]='1';//看这里,玄机就在于如果将这个置成1,就可以在特殊的情况的情况下用上面的判断正确计算了ans++;}else{s[i]=c[i]-'0';}}s[len-1]=c[len-1]-'0';LL k=0;for(int i=0;i<=len;i++){if(!s[i]&&k){if(k>=2)ans++;ans++,k=0;}if(s[i]==1)k++;}write(ans);
}

第二题 inint

题目描述

从起点1开始,每次选择当前数的任意一位上加上去,问得到n的最小步数以及方案数。多组数据。
 
例如,从1开始得到100,有很多方法,其中有下面两种方式:
A. 1-2-4-8-16-17-18-19-20-22-24-28-36-39-48-56-62-68-76-83-91-100
B. 1-2-4-8-16-17-24-28-36-39-48-56-62-68-76-83-91-100
显然,B只需要17步。
而事实上,有两种17步的方法。
C. 1-2-4-8-16-22-24-28-36-39-48-56-62-68-76-83-91-100

输入格式

第一行一个T
接下来T行每行一个n

输出格式

对于每个n输出得到n的最小步数和方案数,方案数mod 1000000007后输出
如果无法得到输出IMPOSSIBLE

数据规模

对于20%的数据n<=10^6
对于60%的数据n<=10^9
对于100%的数据n<=10^12,T<=100

思路解析:

这道题真正体现了大魔王的功力,太难了。

首先,你可以发现数据太大了,普通的dp O(n)都带不动,只能另寻他法。

这时候,魔王Ender想出了预处理后几位的跳跃,再暴力Dp,但不幸TLE了,这时候,他灵机一动,都处理了几位了,为什么不加一维来存储位数,相当于10位倍增。

可以用dp[S][k][i][j]来表示:

S是状态压缩成二进制来表示每一种数字出现过没有,9位,最大512。

k表示这是第几位。

i表示起点为0...0i。

j表示终点为0...0j。

这样最后再用每一个n来刷一遍就好了,至于方案数,就不用讲了吧。

见代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<cmath>
#include<vector>
using namespace std;
#define LL long long
#define M (513)
#define Mod (1000000007)
#define isdigit(x) ((x) >= '0' && (x) <= '9')
LL read() {LL res = 0;char c = getchar();while(!isdigit(c)) c = getchar();while(isdigit(c)) res = ((res << 1) + (res << 3) + c - 48), c = getchar();return res;
}
void write(LL x) {if(x / 10) write(x / 10);putchar(x % 10 + '0');
}
LL f[M][15][12][12],fs[M][15][12][12],s[15][12],cnt[15][12];
LL T,n;
bool vis[20];
void get(LL x){for(LL i=1;i<=9;i++,x>>=1ll)vis[i]=x&1ll;
}
void pre(){memset(f,0x3f,sizeof(f));//最低位for(LL S=0;S<M-1;S++){for(LL i=9;i>=0;i--){memset(vis,0,sizeof(vis));get(S);vis[i]=1;for(LL j=0;j<=8;j++){if(vis[j+10-i])f[S][0][i][j]=1ll,fs[S][0][i][j]=1ll;else{for(LL k=i+1;k<=9;k++)if(vis[k-i]){if(f[S][0][k][j]+1<f[S][0][i][j])f[S][0][i][j]=f[S][0][k][j]+1,fs[S][0][i][j]=0;if(f[S][0][k][j]+1==f[S][0][i][j])fs[S][0][i][j]+=fs[S][0][k][j];}}}}}for(LL i=1;i<=11;i++){//倍增for(LL S=0;S<M-1;S++)for(LL st=0;st<=8;st++){memset(s,0x3f,sizeof(s));s[0][st]=0,cnt[0][st]=1;for(LL j=0;j<=9;j++)for(LL a=0;a<9;a++)for(LL b=0;b<9;b++){LL ns=j?S|(1<<(j-1)):S;if(s[j][a]+f[ns][i-1][a][b]<s[j+1][b])s[j+1][b]=s[j][a]+f[ns][i-1][a][b],cnt[j+1][b]=0;if(s[j][a]+f[ns][i-1][a][b]==s[j+1][b])cnt[j+1][b]=(cnt[j+1][b]+cnt[j][a]*fs[ns][i-1][a][b]%Mod)%Mod;}for(LL ed=0;ed<9;ed++)f[S][i][st][ed]=s[10][ed],fs[S][i][st][ed]=cnt[10][ed];           }}
}
int main(){freopen("inint.in","r",stdin);freopen("inint.out","w",stdout);pre();T=read();while(T--){memset(s,0x3f,sizeof(s));n=read();LL t=0ll,S=0ll;s[0][1]=0ll;cnt[0][1]=1ll;for(LL i=1000000000000ll,ti=11;i>=10;i/=10,ti--){for(LL j=0;j<(n/i)%10;j++){//取每一位值t=!t;memset(s[t],0x3f,sizeof(s[t]));LL ns=j?S|(1<<(j-1)):S;for(LL a=0;a<9;a++)for(LL b=0;b<9;b++){if(s[!t][a]+f[ns][ti][a][b]<s[t][b])s[t][b]=s[!t][a]+f[ns][ti][a][b],cnt[t][b]=0;if(s[!t][a]+f[ns][ti][a][b]==s[t][b])cnt[t][b]=(cnt[t][b]+(LL)cnt[!t][a]*fs[ns][ti][a][b]%Mod)%Mod;}}if((n/i)%10)S|=1<<((n/i)%10-1);//这个颜色可用了}for(LL i=0;i<=9;i++){memset(vis,0,sizeof(vis));get(S);vis[i]=1;for(LL a=1;a<=9;a++){if(vis[a]&&i+a<=9){LL j=i+a;if(s[t][j]>s[t][i]+1)s[t][j]=s[t][i]+1,cnt[t][j]=0;if(s[t][i]+1==s[t][j])cnt[t][j]=(cnt[t][j]+cnt[t][i])%Mod;}}}if(s[t][n%10]==0x3f3f3f3f3f3f3f3fll)puts("IMPOSSIBLE");elsewrite(s[t][n%10]),putchar(' '),write(cnt[t][n%10]),putchar('\n');}
}

STO GZM Orz %%%% ender魔王考试题解(前两道)(贪心和DP)STO WK orz相关推荐

  1. 【JAVA】力扣第198场周赛代码+解题思路——【排名第 1 ~ 300 名的参赛者可获「微软中国」简历内推机会】做对前两道就能排到268/ 5778(4.6%)

    目录 前言 一.题目:5464. 换酒问题 题解 代码 二.题目:5465. 子树中标签相同的节点数 题解 代码 三.题目:5466. 最多的不重叠子字符串 题解 代码 四.5467. 找到最接近目标 ...

  2. 马歇尔计划软件测试自学,绝密本科目考试启用前及综合应用.doc

    绝密★本科目考试启用前 2017年普通高等学校招生全国统一考试 文科综合能力测试(北京卷) 本试卷共18页,共300分,考试时长150分钟,考生务必将答案答在答题卡上,在试卷上作答无效,考试结束后,将 ...

  3. [NJUST]19级上机考试题解

    [NJUST]19级上机考试题解 (先赞后看,已成习惯) 上机考试结束了,成绩也出来了,大家有没有考到500分吖 ,我整理了一些同学的满分代码,以及我对题目的一些个人理解. A 日历题 题意: 输入 ...

  4. 题解| 前端面试题分析之美团

    美团面试题分析 简答题 1. 问:以下变量i,s,a在堆上还是栈中?最后执行a.i的值是多少? class A {String i = "op";void func(String ...

  5. Leetcode动态规划题解1——两要素和解题步骤

    动态规划概述 动态规划,是一种解决最优化问题的方法,在我看来就是一种穷举算法.只不过,这种穷举算法具有"特殊性质".一般的穷举法,就是列出问题所有的可行解,然后通过比较找到最优解, ...

  6. 如果学号的前两位表示年级,要查找98级女生的姓名,请写出相应的SQL语句

    下面是学生成绩表(score)的结构说明 字段名称 字段解释 字段类型 字段长度 约束 sc_number 学号 字符 8 PK sc_name 姓名 字符 50 Not null sc_sex 性别 ...

  7. 前两天去A公司面试,面试管问的题目一下子闷了。很郁闷。重新答题。在这里分享一下...

    前两天去A公司面试,面试管问的题目一下子闷了.很郁闷.重新答题.在这里分享一下. 1) 问:请问你最近做过什么项目,介绍一下大致的情况? 答:做了http://www.chinatravel.net, ...

  8. ​CSRankings年度更新,清华北大包揽AI领域前两名​ | AI日报

    CSRankings年度更新,清华北大包揽AI领域前两名,CMU第三 全球院校计算机科学领域实力排名开源项目CSRankings,更新了2020-2021年的最新数据.最新排名显示: AI(含5项细分 ...

  9. mysql每学科前两名 having_mysql 分组查询前n条数据

    今天去面试,碰到一道面试题: 有一个学生成绩表,表中有 表id.学生名.学科.分数.学生id .查询每科学习最好的两名学生的信息: 建表sql: CREATE TABLE `stuscore` ( ` ...

最新文章

  1. Jquer学习之jQuery(function(){})与(function(){})(jQuery)之间的区别
  2. android gridview item 点击,Android-取消GridView/ListView item被点击时的效果
  3. 视频培训网站发布问题
  4. oracle_base,Oracle--基础知识--Oracle 数据库目录 ORACLE_BASE ORACLE_HOME
  5. Python while循环 - Python零基础入门教程
  6. 洛谷P1307题解(Java语言描述)
  7. 《那些年啊,那些事——一个程序员的奋斗史》——81
  8. [OpenBMC] 快速上手OpenBMC的Redfish
  9. 计算机专业必须用英语口语要求,哪些专业需要英语口语考试
  10. C4D玻璃材质调节方法
  11. python项目实战:实现游戏敏感词汇过滤器
  12. photoshop教程:替换颜色
  13. 谷歌浏览器插入百度翻译插件
  14. 几款流行监控系统简介
  15. 那些年,我们一起做过的 Java 课后练习题(61 - 65)
  16. 显卡的指标有哪些方面_纯干货!显卡购买重要参数:老司机勿入
  17. bzoj 2081: [Poi2010]Beads 哈希
  18. MongoDB的Journal
  19. 色彩校正中的 gamma 值是什么?
  20. 第十三届蓝桥杯单片机完整程序

热门文章

  1. Intel现有移动版CPU介绍和性能评价
  2. 常见人事问题汇总(中)
  3. Jsp格式化显示Date类型数据
  4. Windows10移动热点 所选网络波段不可用
  5. VIM中如何进行查找和替换
  6. Flash务实主义(三)——最短路径原则(下)
  7. 搜题公众号怎么搭建制作(微信公众号查题搭建制作教程)
  8. 《生活的经济解释》精髓:台湾大学经济系教授熊秉元是如何用经济学的眼光看生活的?
  9. 如何通过python画loss曲线 点线颜色及点线型设置说明(超实用)
  10. 三维可视化管理的内容及六项原则