2022-02-21每日刷题打卡

本文介绍了两个算法问题的解决方案:一是导弹拦截问题,通过动态规划找到最长递增子序列;二是城市交通路网优化,利用Dijkstra算法求解最短路径。这两个问题都涉及到了图论和动态规划的应用,对于理解算法和解决实际问题具有指导意义。
摘要由CSDN通过智能技术生成

一、一本通 1260:【例9.4】拦截导弹(Noip1999)

1. 问题描述

img

2. 问题解决

#include<iostream>
using namespace std;
int a[N],b[N],c[N];
int main()
{
    int n=0,maxx=1;
    
    while(scanf("%d",&a[n++])!=EOF)
        
    for(int i=0;i<n;i++)
    {
        b[i]=1;
        for(int j=0;j<i;j++)
            if(a[j]>=a[i]&&b[j]+1>b[i])
                b[i]=b[j]+1;
        maxx=max(maxx,b[i]);
    }
    printf("%d\n",maxx);
    
    maxx=1;
    for(int i=0;i<n;i++)
    {
        c[i]=1;
        for(int j=0;j<i;j++)
            if(a[j]<a[i]&&c[j]+1>c[i])
                c[i]=c[j]+1;
        maxx=max(maxx,c[i]);
    }
    printf("%d\n",maxx);
    return 0;
}

二、一本通 1261:【例9.5】城市交通路网

1. 问题描述

img

2. 问题解决

#include<iostream>
#define PI acos(-1.0)
#define INF 0x3f3f3f3f
#define LL long long
#define Pair pair<int,int>
LL quickPow(LL a,LL b){ LL res=1; while(b){if(b&1)res*=a; a*=a; b>>=1;} return res; }
LL multMod(LL a,LL b,LL mod){ a%=mod; b%=mod; LL res=0; while(b){if(b&1)res=(res+a)%mod; a=(a<<=1)%mod; b>>=1; } return res%mod;}
LL quickMultPowMod(LL a, LL b,LL mod){ LL res=1,k=a; while(b){if((b&1))res=multMod(res,k,mod)%mod; k=multMod(k,k,mod)%mod; b>>=1;} return res%mod;}
LL quickPowMod(LL a,LL b,LL mod){ LL res=1; while(b){if(b&1)res=(a*res)%mod; a=(a*a)%mod; b>>=1; } return res; }
LL getInv(LL a,LL mod){ return quickPowMod(a,mod-2,mod); }
LL GCD(LL x,LL y){ return !y?x:GCD(y,x%y); }
LL LCM(LL x,LL y){ return x/GCD(x,y)*y; }
const double EPS = 1E-6;
const int MOD = 1000000000+7;
const int N = 1000+5;
const int dx[] = {0,0,-1,1,1,-1,1,1};
const int dy[] = {1,-1,0,0,-1,1,-1,1};
using namespace std;
 
int n;
int G[N][N];
bool vis[N];
int dis[N];
int pre[N];
int f = 1;
void print(int x) {
    if (x == 0)
        return;
    else {
        print(pre[x]);
        printf("%d ", x + 1);
    }
}
 
int main() {
    scanf("%d", &n);
    memset(dis, INF, sizeof(dis));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &G[i][j]);
            if (G[i][j] == 0)
                G[i][j] = INF;
            else if (i == 0)
                dis[j] = G[i][j];
        }
    }
 
    dis[0] = 0;
    for (int i = 0; i < n; i++) {
        int minn = INF, x = 0;
        for (int j = 0; j < n; j++) 
            if (!vis[j] && minn > dis[j])
                minn = dis[j], x = j;
        vis[x] = 1;
        for (int j = 0; j < n; j++){
            if (G[x][j] + dis[x] < dis[j]) {
                pre[j] = x;
                dis[j] = G[x][j] + dis[x];
            }
        }
    }
    printf("minlong=%d\n", dis[n - 1]);
    printf("1 ");
    print(n - 1);
    return 0;
}

三、蓝桥杯 十届 特别数的和

1. 问题描述

img

2. 问题解决

#include <iostream>

using namespace std;

bool check(int n){
    while(n){
        int s = n % 10;
        n /= 10;
        if(s == 1 || s == 2 || s == 9 || s == 0){
            return true;
            break;
        }
    }
    return false;
}
int main()
{
    int m,sum = 0;
    cin>>m;
    for(int i = 1 ; i <= m ;i++){
        if(check(i)) sum += i;
    }
    cout<<sum;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值