【牛客练习赛13】 A B C D【康拓展开】 E【DP or 记忆化搜索】 F 【思维】

A 幸运数字Ⅰ

链接:https://www.nowcoder.com/acm/contest/70/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
现在,给定一个字符串s,请求出一个字符串,使得:
1、它所代表的整数是一个幸运数字;
2、它非空;
3、它作为s的子串(不是子序列)出现了最多的次数(不能为0次)。
请求出这个串(如果有多解,请输出字典序最小的那一个)。
输入描述:
串s(1 <= |s| <= 50)。s只包含数字字符,可以有前导零。
输出描述:
一个串表示答案。
无解输出-1。
示例1
输入

047
输出

4
示例2
输入

16
输出

-1

#include 
using namespace std;
#define LL long long
#define ULL unsigned long long

const int  N = 3e4;
const int M = 10000+1;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const LL inff = 0x3f3f3f3f3f3f3f3f;


int cnt[N];
int main(){
    string s; cin>>s;
    int a,b;
    a=b=0;
    int flag=0;
    for(int i=0;iif(s[i]=='7'||s[i]=='4') {
            flag=1;
        }
        cnt[s[i]-'0']++;
    }
    if(!flag) puts("-1");
    else {
        if(cnt[7]>cnt[4]) cout<<7<else cout<<4<return 0;
}

B 幸运数字Ⅱ

链接:https://www.nowcoder.com/acm/contest/70/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
定义next(x)为大于等于x的第一个幸运数字。给定l,r,请求出next(l) + next(l + 1) + … + next(r - 1) + next(r)。
输入描述:
两个整数l和r (1 <= l <= r <= 1000,000,000)。
输出描述:
一个数字表示答案。
示例1
输入

2 7
输出

33
示例2
输入

7 7
输出

7

分析: 超暴力 解法,直接暴力求出从1到第一个大于1e9中的幸运数字
1000多点。
注意第一个大于1e9的幸运数字,程序暴力跑不出来,所以我们可以找一下规律 从而得到第一个大于1e9的幸运数字
代码

#include 
using namespace std;
#define LL long long
#define ULL unsigned long long

const int  N = 100;
const int M = 10000+1;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const LL inff = 0x3f3f3f3f3f3f3f3f;


LL X[10000]={0,4,7,44,47,74,77,444,447,474,477,744,747,774,777,4444,4447,4474,4477,4744,4747,4774,4777,7444,7447,7474,7477,7744,7747,7774,7777,44444,44447,44474,44477,44744,44747,44774,44777,47444,47447,47474,47477,47744,47747,47774,47777,74444,74447,74474,74477,74744,74747,74774,74777,77444,77447,77474,77477,77744,77747,77774,77777,444444,444447,444474,444477,444744,444747,444774,444777,447444,447447,447474,447477,447744,447747,447774,447777,474444,474447,474474,474477,474744,474747,474774,474777,477444,477447,477474,477477,477744,477747,477774,477777,744444,744447,744474,744477,744744,744747,744774,744777,747444,747447,747474,747477,747744,747747,747774,747777,774444,774447,774474,774477,774744,774747,774774,774777,777444,777447,777474,777477,777744,777747,777774,777777,4444444,4444447,4444474,4444477,4444744,4444747,4444774,4444777,4447444,4447447,4447474,4447477,4447744,4447747,4447774,4447777,4474444,4474447,4474474,4474477,4474744,4474747,4474774,4474777,4477444,4477447,4477474,4477477,4477744,4477747,4477774,4477777,4744444,4744447,4744474,4744477,4744744,4744747,4744774,4744777,4747444,4747447,4747474,4747477,4747744,4747747,4747774,4747777,4774444,4774447,4774474,4774477,4774744,4774747,4774774,4774777,4777444,4777447,4777474,4777477,4777744,4777747,4777774,4777777,7444444,7444447,7444474,7444477,7444744,7444747,7444774,7444777,7447444,7447447,7447474,7447477,7447744,7447747,7447774,7447777,7474444,7474447,7474474,7474477,7474744,7474747,7474774,7474777,7477444,7477447,7477474,7477477,7477744,7477747,7477774,7477777,7744444,7744447,7744474,7744477,7744744,7744747,7744774,7744777,7747444,7747447,7747474,7747477,7747744,7747747,7747774,7747777,7774444,7774447,7774474,7774477,7774744,7774747,7774774,7774777,7777444,7777447,7777474,7777477,7777744,7777747,7777774,7777777,44444444,44444447,44444474,44444477,44444744,44444747,44444774,44444777,44447444,44447447,44447474,44447477,44447744,44447747,44447774,44447777,44474444,44474447,44474474,44474477,44474744,44474747,44474774,44474777,44477444,44477447,44477474,44477477,44477744,44477747,44477774,44477777,44744444,44744447,44744474,44744477,44744744,44744747,44744774,44744777,44747444,44747447,44747474,44747477,44747744,44747747,44747774,44747777,44774444,44774447,44774474,44774477,44774744,44774747,44774774,44774777,44777444,44777447,44777474,44777477,44777744,44777747,44777774,44777777,47444444,47444447,47444474,47444477,47444744,47444747,47444774,47444777,47447444,47447447,47447474,47447477,47447744,47447747,47447774,47447777,47474444,47474447,47474474,47474477,47474744,47474747,47474774,47474777,47477444,47477447,47477474,47477477,47477744,47477747,47477774,47477777,47744444,47744447,47744474,47744477,47744744,47744747,47744774,47744777,47747444,47747447,47747474,47747477,47747744,47747747,47747774,47747777,47774444,47774447,47774474,47774477,47774744,47774747,47774774,47774777,47777444,47777447,47777474,47777477,47777744,47777747,47777774,47777777,74444444,74444447,74444474,74444477,74444744,74444747,74444774,74444777,74447444,74447447,74447474,74447477,74447744,74447747,74447774,74447777,74474444,74474447,74474474,74474477,74474744,74474747,74474774,74474777,74477444,74477447,74477474,74477477,74477744,74477747,74477774,74477777,74744444,74744447,74744474,74744477,74744744,74744747,74744774,74744777,74747444,74747447,74747474,74747477,74747744,74747747,74747774,74747777,74774444,74774447,74774474,74774477,74774744,74774747,74774774,74774777,74777444,74777447,74777474,74777477,74777744,74777747,74777774,74777777,77444444,77444447,77444474,77444477,77444744,77444747,77444774,77444777,77447444,77447447,77447474,77447477,77447744,77447747,77447774,77447777,77474444,77474447,77474474,77474477,77474744,77474747,77474774,77474777,77477444,77477447,77477474,77477477,77477744,77477747,77477774,77477777,77744444,77744447,77744474,77744477,77744744,77744747,77744774,77744777,77747444,77747447,77747474,77747477,77747744,77747747,77747774,77747777,77774444,77774447,77774474,77774477,77774744,77774747,77774774,77774777,77777444,77777447,77777474,77777477,77777744,77777747,77777774,77777777,444444444,444444447,444444474,444444477,444444744,444444747,444444774,444444777,444447444,444447447,444447474,444447477,444447744,444447747,444447774,444447777,444474444,444474447,444474474,444474477,444474744,444474747,444474774,444474777,444477444,444477447,444477474,444477477,444477744,444477747,444477774,444477777,444744444,444744447,444744474,444744477,444744744,444744747,444744774,444744777,444747444,444747447,444747474,444747477,444747744,444747747,444747774,444747777,444774444,444774447,444774474,444774477,444774744,444774747,444774774,444774777,444777444,444777447,444777474,444777477,444777744,444777747,444777774,444777777,447444444,447444447,447444474,447444477,447444744,447444747,447444774,447444777,447447444,447447447,447447474,447447477,447447744,447447747,447447774,447447777,447474444,447474447,447474474,447474477,447474744,447474747,447474774,447474777,447477444,447477447,447477474,447477477,447477744,447477747,447477774,447477777,447744444,447744447,447744474,447744477,447744744,447744747,447744774,447744777,447747444,447747447,447747474,447747477,447747744,447747747,447747774,447747777,447774444,447774447,447774474,447774477,447774744,447774747,447774774,447774777,447777444,447777447,447777474,447777477,447777744,447777747,447777774,447777777,474444444,474444447,474444474,474444477,474444744,474444747,474444774,474444777,474447444,474447447,474447474,474447477,474447744,474447747,474447774,474447777,474474444,474474447,474474474,474474477,474474744,474474747,474474774,474474777,474477444,474477447,474477474,474477477,474477744,474477747,474477774,474477777,474744444,474744447,474744474,474744477,474744744,474744747,474744774,474744777,474747444,474747447,474747474,474747477,474747744,474747747,474747774,474747777,474774444,474774447,474774474,474774477,474774744,474774747,474774774,474774777,474777444,474777447,474777474,474777477,474777744,474777747,474777774,474777777,477444444,477444447,477444474,477444477,477444744,477444747,477444774,477444777,477447444,477447447,477447474,477447477,477447744,477447747,477447774,477447777,477474444,477474447,477474474,477474477,477474744,477474747,477474774,477474777,477477444,477477447,477477474,477477477,477477744,477477747,477477774,477477777,477744444,477744447,477744474,477744477,477744744,477744747,477744774,477744777,477747444,477747447,477747474,477747477,477747744,477747747,477747774,477747777,477774444,477774447,477774474,477774477,477774744,477774747,477774774,477774777,477777444,477777447,477777474,477777477,477777744,477777747,477777774,477777777,744444444,744444447,744444474,744444477,744444744,744444747,744444774,744444777,744447444,744447447,744447474,744447477,744447744,744447747,744447774,744447777,744474444,744474447,744474474,744474477,744474744,744474747,744474774,744474777,744477444,744477447,744477474,744477477,744477744,744477747,744477774,744477777,744744444,744744447,744744474,744744477,744744744,744744747,744744774,744744777,744747444,744747447,744747474,744747477,744747744,744747747,744747774,744747777,744774444,744774447,744774474,744774477,744774744,744774747,744774774,744774777,744777444,744777447,744777474,744777477,744777744,744777747,744777774,744777777,747444444,747444447,747444474,747444477,747444744,747444747,747444774,747444777,747447444,747447447,747447474,747447477,747447744,747447747,747447774,747447777,747474444,747474447,747474474,747474477,747474744,747474747,747474774,747474777,747477444,747477447,747477474,747477477,747477744,747477747,747477774,747477777,747744444,747744447,747744474,747744477,747744744,747744747,747744774,747744777,747747444,747747447,747747474,747747477,747747744,747747747,747747774,747747777,747774444,747774447,747774474,747774477,747774744,747774747,747774774,747774777,747777444,747777447,747777474,747777477,747777744,747777747,747777774,747777777,774444444,774444447,774444474,774444477,774444744,774444747,774444774,774444777,774447444,774447447,774447474,774447477,774447744,774447747,774447774,774447777,774474444,774474447,774474474,774474477,774474744,774474747,774474774,774474777,774477444,774477447,774477474,774477477,774477744,774477747,774477774,774477777,774744444,774744447,774744474,774744477,774744744,774744747,774744774,774744777,774747444,774747447,774747474,774747477,774747744,774747747,774747774,774747777,774774444,774774447,774774474,774774477,774774744,774774747,774774774,774774777,774777444,774777447,774777474,774777477,774777744,774777747,774777774,774777777,777444444,777444447,777444474,777444477,777444744,777444747,777444774,777444777,777447444,777447447,777447474,777447477,777447744,777447747,777447774,777447777,777474444,777474447,777474474,777474477,777474744,777474747,777474774,777474777,777477444,777477447,777477474,777477477,777477744,777477747,777477774,777477777,777744444,777744447,777744474,777744477,777744744,777744747,777744774,777744777,777747444,777747447,777747474,777747477,777747744,777747747,777747774,777747777,777774444,777774447,777774474,777774477,777774744,777774747,777774774,777774777,777777444,777777447,777777474,777777477,777777744,777777747,777777774,777777777,4444444444};
int sz=1024;
LL sum[10000];
int main(){

    for(int i=1;i1]+X[i]; }
    int l,r;cin>>l>>r;
    int a=lower_bound(X,X+sz,l)-X;

    LL ans=0;int i; int L=l;
    for( i=a;iif(X[i]>=r){
             ans+=(r-L+1)*X[i];
            break;
        }
        ans+=X[i]*(X[i]-L+1);
        L=X[i]+1;
    }
    printf("%lld\n",ans);
return 0;
}

分析二 :因为我们知道数字只有4和7,所以我们可以通过二进制枚举 (或者bfs,dfs)得到长度小于等于10的所有情况,然后sort一下。

C 幸运数字Ⅲ

链接:https://www.nowcoder.com/acm/contest/70/C
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
定义一个数字为幸运数字当且仅当它的所有数位都是4或者7。
比如说,47、744、4都是幸运数字而5、17、467都不是。
假设现在有一个数字d,现在想在d上重复k次操作。
假设d有n位,用d1,d2,…,dn表示。
对于每次操作,我们想要找到最小的x (x < n),使得dx=4并且dx+1=7。
如果x为奇数,那么我们把dx和dx+1都变成4;
否则,如果x为偶数,我们把dx和dx+1都变成7;
如果不存在x,那么我们不做任何修改。
现在请问k次操作以后,d会变成什么样子。
输入描述:
第一行两个整数n,k表示d的长度和操作次数。
第二行一个数表示d。数据保证不存在前导零。
1 <= n <= 100,000
0 <= k <= 1000,000,000
输出描述:
一个数字表示答案。
示例1
输入

7 4
4727447
输出

4427477
示例2
输入

4 2
4478
输出

4478

分析: 可以发现477或者447这种的并且4所在位置为奇数时候,会有循环。而其他情况下,都是正想不可逆的,所以遇到一个447或者477并且4位置为奇数的情况就可以停止,然后根据剩下次数的奇偶来决定最后序列为什么。
代码

#include 
using namespace std;
#define LL long long
#define ULL unsigned long long

const int  N = 1e5+11;
const int M = 10000+1;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const LL inff = 0x3f3f3f3f3f3f3f3f;



char s[N];
int main(){
    LL n,k;cin>>n>>k;
    scanf("%s",s+1);
    LL cnt=0;
    for(int i=1;i<=n;i++){
        if(s[i]=='4' &&i+1<=n && s[i+1]=='7' &&i+2<=n && s[i+2]=='7')  {
            if(i&1){
                LL cha=k-cnt;
                if(cha&1) {
                    s[i+1]='4';
                    for(int i=1;i<=n;i++) printf("%c",s[i]);
                    return 0;
                }else{

                    for(int i=1;i<=n;i++) printf("%c",s[i]);
                    return 0;
                }
            }
        }

        if(s[i]=='4' && i+1<=n && s[i+1]=='7') {

            if(i&1) {
                s[i]=s[i+1]='4';
            }else  {
                s[i]=s[i+1]='7';
            }
            cnt++;
            if(cnt==k) break;
            if(i>=2) i-=2;
            else if(i>=1) i-=1;
        }
    }

    for(int i=1;i<=n;i++) printf("%c",s[i]);
return 0;
}

D 幸运数字Ⅳ

链接

E 乌龟跑步

链接:https://www.nowcoder.com/acm/contest/70/E
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
有一只乌龟,初始在0的位置向右跑。
这只乌龟会依次接到一串指令,指令T表示向后转,指令F表示向前移动一个单位。乌龟不能忽视任何指令。
现在我们要修改其中正好n个指令(一个指令可以被改多次,一次修改定义为把某一个T变成F或把某一个F变成T)。
求这只乌龟在结束的时候离起点的最远距离。(假设乌龟最后的位置为x,我们想要abs(x)最大,输出最大的abs(x))
输入描述:
第一行一个字符串c表示指令串。c只由F和T构成。
第二行一个整数n。
1 <= |c| <= 100, 1 <= n <= 50
输出描述:
一个数字表示答案。
示例1
输入

FT
1
输出

2
示例2
输入

FFFTFFF
2
输出

6

分析: 一看题目 就知道 是DP方向的,DP我基本不会,但是我会记忆化搜索,对于一部分DP来说,只要用DFS可以遍历其所有状态,我加上记忆化,那么一定可以过【状态一定要能够用数组来存储】。
比如这道题 : dfs(int now,int opc,int sta,int pre) 表示 现在该访问now这个命令,opc表示当前还剩下几个可改变的操作,sta表示当前是正向还是反向,pre表示我是站在那个位置来执行当前的命令。
可以发现任意时间我都可以用上述 几个参数 都可以表示当前状态,这个就是关键——-是否可以将DP转化为记忆化搜索。

代码写的有点丑了,但是只要知道上述的思路,记忆化搜索(暴力)应该很好写吧。

#include 
using namespace std;
#define LL long long
#define ULL unsigned long long

const int  N = 200+11;
const int M = 110;
const int mod = 1e9+7;
const int inf = 0x3f3f3f3f;
const LL inff = 0x3f3f3f3f3f3f3f3f;

char s[N]; int len;
int dp[N][N][2][N*2];
int dfs(int now,int opc,int sta,int pre){
    if(now==len+1 && !opc) return pre;
    if(now==len+1) return M;
    if(dp[now][opc][sta][pre]!=-1) return dp[now][opc][sta][pre];

    int ans=0,cha=0;
    if(s[now]=='F') {
            if(sta){
                int a=dfs(now+1,opc,sta,pre+1 ) ;
                int b=abs(a-M);
                if( b>=abs(cha)){
                   cha=b;
                   ans=a;
               }
            }else {
                int a=dfs(now+1,opc,sta,pre-1) ;
                int b=abs(a-M);
               if( b>=abs(cha)){
                   cha=b;
                   ans=a;
               }
            }
        }else {
            if(sta){
                int a=dfs(now+1,opc,sta^1,pre ) ;
                int b=abs(a-M);
               if( b>=abs(cha)){
                   cha=b;
                   ans=a;
               }
            }else {
                int a=dfs(now+1,opc,sta^1,pre) ;
                int b=abs(a-M);
                if( b>=abs(cha)){
                   cha=b;
                   ans=a;
               }
            }

        }

    if(opc>0){
        if(s[now]=='T') {
            if(sta){
                int a=dfs(now+1,opc-1,sta,pre+1 ) ;
                int b=abs(a-M);
               if( b>=abs(cha)){
                   cha=b;
                   ans=a;
               }
            }else{
                int a=dfs(now+1,opc-1,sta,pre-1) ;
                int b=abs(a-M);
                if( b>=abs(cha)){
                   cha=b;
                   ans=a;
               }
            }
        }else {
            if(sta){
                int a=dfs(now+1,opc-1,sta^1,pre ) ;
               int b=abs(a-M);
                if( b>=abs(cha)){
                   cha=b;
                   ans=a;
               }
            }else {
                int a=dfs(now+1,opc-1,sta^1,pre) ;
                int b=abs(a-M);
                if( b>=abs(cha)){
                   cha=b;
                   ans=a;
               }
            }
        }
    }

    return dp[now][opc][sta][pre]=ans;
}

int main(){

    memset(dp,-1,sizeof(dp));
    int n; scanf("%s %d",s+1,&n); len=strlen(s+1);
    dfs(1,n,1,M);  // 从M点开始,这样才不会导致数组越界 ,因为dfs中pre表示当前位置
    cout<<abs(dp[1][n][1][M]-M);
return 0;
}


F m皇后

链接:https://www.nowcoder.com/acm/contest/70/F
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
在一个n*n的国际象棋棋盘上有m个皇后。
一个皇后可以攻击其他八个方向的皇后(上、下、左、右、左上、右上、左下、右下)。
对于某个皇后,如果某一个方向上有其他皇后,那么这个方向对她就是不安全的。
对于每个皇后,我们都能知道她在几个方向上是不安全的。

现在我们想要求出t0,t1,…,t8,其中ti表示恰有i个方向是”不安全的”的皇后有多少个。
输入描述:
第一行两个整数n,m表示棋盘大小和皇后数量。
接下来m行每行两个整数ri,ci表示皇后坐标。
1 <= n, m <= 100,000
1 <= ri, ci <= n
数据保证没有皇后在同一个位置上。
输出描述:
一行九个整数表示答案。
空格隔开,结尾无空格
示例1
输入

8 4
4 3
4 8
6 5
1 6
输出

0 3 0 1 0 0 0 0 0
示例2
输入

10 3
1 1
1 2
1 3
输出

0 2 1 0 0 0 0 0 0

分析: 想了许久还是无果。 看了别人的题解,才恍然大悟。
我们可以预处理出来4个方向(水平,垂直,斜率为1,斜率为-1)的最两端的值。水平两端的值意思是: 每一行 中最左端的点和最右端的点。
垂直两端的值意思是:每一列中最上端和的点和最下端的点。
….

显然 水平和垂直方向很好处理,但是斜着的怎么处理呢?
其实是有一个规律的:
1》对于斜率为-1的,在二维矩阵中肯定也有许多条吧,但是在同一条直线上的,其横坐标+纵坐标一定为一个定值,而且直线不一样,其x+y值也不同,这种方法就可以根据x和y直接确定其斜率为-1方向上。
举个例子吧:
第一条直线 : (0,4) (2,2)(4,0) 定值为 4
第二条直线: (0,3) (1 , 2 ) ( 3 , 0 ) 定值为 3

2》对于斜率为+1的, y-x 一定为一个定值,同理不同直线其定值也不同。可以自己找几条直线看看。

参考的题解链接
代码

#include 
using namespace std;
#define LL long long
#define ULL unsigned long long

const int  N = 1e5+11;
const int M = 10000+1;
const int mod = 765431;
const int inf = 0x3f3f3f3f;
const LL inff = 0x3f3f3f3f3f3f3f3f;

int mnd[N],mnl[N],mnlu[N*2],mnld[N*2];
int mxu[N],mxr[N],mxrd[N*2],mxru[N*2];

int X[N],Y[N];
int ANS[10];
int main(){
    memset(mnd,inf,sizeof(mnd));
    memset(mnl,inf,sizeof(mnl));
    memset(mnlu,inf,sizeof(mnlu));
    memset(mnld,inf,sizeof(mnld));

    int n,m;scanf("%d%d",&n,&m);

    for(int i=1;i<=m;i++){
        int x,y;  scanf("%d%d",&x,&y);
        X[i]=x; Y[i]=y;

        mnd[x]=min(mnd[x],y);
        mxu[x]=max(mxu[x],y);

        mnl[y]=min(mnl[y],x);
        mxr[y]=max(mxr[y],x);

        mnlu[x+y]=min(mnlu[x+y],x);
        mxrd[x+y]=max(mxrd[x+y],x);

        mnld[y-x+N]=min(mnld[y-x+N],x);  //加N为了数组不越界
        mxru[y-x+N]=max(mxru[y-x+N],x);
    }

    for(int i=1;i<=m;i++){
        int ge=0;
        int x=X[i];int y=Y[i];
        if(y>mnd[x]) ge++;
        if(yif(x>mnl[y]) ge++;
        if(xif(x>mnlu[x+y]) ge++;
        if(xif(x>mnld[y-x+N]) ge++;
        if(xfor(int i=0;i<9;i++){
        if(i!=0) putchar(' ');
        printf("%d",ANS[i]);
    }
return 0;
}

你可能感兴趣的:(思维,模拟,DFS,+,BFS,各种比赛)