算法设计与分析上机作业04

问题 A: 繁衍

内存限制:128 MB时间限制:2.000 S

评测方式:文本比较命题人:dsadmin

提交:894解决:544

返回比赛提交提交记录侧边提交

题目描述

有一种生物A,一天就能长大,长大的A每过一天就能生一个小A(刚长大的A会从下一天开始生小A),小A过一天后也会长大。。。以此往复。现在,我们有一个刚出生的小A,问n天后共有多少个长大的生物A

输入

输入仅一行,包含一个自然数 n,0<=n<=46.

输出

长大的A的个数

样例输入 复制

5

样例输出 复制

5

提示

sample 2
0
0

code

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
#define ll long long
#define int long long
#define MAX_SIZE 1005
 
int a[50];
 
 
signed main(){
    int n;cin>>n;
    a[0]=0;
    a[1]=1;
    a[2]=1;
    for(int i=3;i<=n;i++){
        a[i]=a[i-1]+a[i-2];
    }
    cout<<a[n];
    return 0;
}

问题 B: 平面分割

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:dsadmin

提交:545解决:488

返回比赛提交提交记录侧边提交

题目描述

同一平面内有 n(n≤500)条直线,已知其中 p(p≥2)条直线相交于同一点,则这 n 条直线最多能将 平面分割成多少个不同的区域? 

输入

两个整数 n(n≤500)和 p(2≤p≤n)。 

输出

一个正整数,代表最多分割成的区域数目。 

样例输入 复制

12 5

样例输出 复制

73

code 

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
#define ll long long
#define int long long
#define MAX_SIZE 505
 
int a[MAX_SIZE];
 
signed main(){
    int m,n;cin>>n>>m;
    a[m]=m*2;
    for(int i=m+1;i<=n;i++){
        a[i]=a[i-1]+i;
    }
    cout<<a[n];
    return 0;
}

问题 C: 二分查找(binary)

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:jixun2019

提交:933解决:391

返回比赛提交提交记录侧边提交

题目描述

  给出有 n 个元素的由小到大的序列,请你编程找出某元素第一次出现的位置。(n<=10^6)

输入

 第一行:一个整数,表示由小到大序列元素个数;下面 n 行,每行一个整数;最后一行 一个整数 x,表示待查找的元素;

输出

  如果 x 在序列中,则输出 x 第一次出现的位置,否则输出-1。

样例输入 复制

5
3
5
6
6
7
6

样例输出 复制

3

code 

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
#define ll long long
#define int long long
#define MAX_SIZE 1000005
 
int a[MAX_SIZE];
 
 
signed main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    int x;cin>>x;
    int l=1,r=n;
    while(l+1<r)
    {
        int mid=(l+r)/2;
        if(a[mid]>=x)
            r=mid;
        else
            l=mid;
    }
    if(a[l]==x) cout<<l<<endl;
    else if(a[r]==x) cout<<r<<endl;
         else cout<<-1<<endl;
    return 0;
}

问题 D: 求逆序对(deseq)

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:jixun2019

提交:1060解决:358

返回比赛提交提交记录侧边提交

题目描述

给定一个序列 a1,a2,…,an,如果存在 i<j 并且 ai>aj,那么我们称之为逆序对,求逆序对 的数目。

输入

第一行为 n,表示序列长度,接下来的 n 行,第 i+1 行表示序列中的第 i 个数。

输出

所有逆序对总数。

样例输入 复制

4
3
2
3
2

样例输出 复制

3

提示

N<=10^5,Ai<=10^5

code

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
#define ll long long
#define int long long
#define MAX_SIZE 100005
 
int a[MAX_SIZE];
int b[MAX_SIZE];
int ans=0;
 
void func(int l,int r){
    if(l==r) return;
    int mid=(l+r)/2;
    func(l,mid);
    func(mid+1,r);
    int i=l,j=mid+1,k=l;
    while(i<=mid&&j<=r){
        if(a[i]<=a[j]){
            b[k]=a[i];
            i++;k++;
        }
        else{
            b[k]=a[j];
            j++;k++;
            ans+=mid-i+1;
        }
 
    }
    while(i<=mid){
        b[k]=a[i];
        k++;i++;
    }
    while(j<=r){
        b[k]=a[j];
        k++;j++;
    }
    for(int t=l;t<=r;t++){
        a[t]=b[t];
    }
}
 
signed main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    func(1,n);
    cout<<ans;
    return 0;
}

问题 E: 任务安排问题

内存限制:128 MB时间限制:1.000 S

评测方式:文本比较命题人:外部导入

提交:2401解决:953

返回比赛提交提交记录侧边提交

题目描述

某个系统中有一个设备,该设备每次只能分配给一个任务使用,且只有当任务结束后才能再分配给另一个任务使用。 假设系统启动时间计为时间0点,预先有一份任务计划表,预定了每个任务的开始时间点和持续时间。 要求设计算法统计出该设备最多能够满足任务计划表中的多少个任务的使用请求。

输入

输入的第一行为一个整数m,表示要计算的用例的个数。 从第二行开始是m个测试用例的输入数据。 每个测试用例的第一行为一个整数n,表示任务计划表中的任务个数,n≤1000。 每个测试用例的第二行为2*n个整数,分别为每个任务的开始时间点和持续时间,整数之间用空格隔开。

输出

要求对每个测试用例输出一行结果,输出结果为该测试用例下,能够满足的最大任务数。

样例输入 复制

1
11
12 2 2 11 8 4 8 3 6 4 5 4 3 5 5 2 0 6 3 2 1 3

样例输出 复制

4

code 

结束最早的

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
#define ll long long
#define int long long
#define MAX_SIZE 1005
 
typedef struct{
    int start;
    int end;
}mm;
mm m[MAX_SIZE];
 
bool cmp(mm a,mm b){
    return a.end<b.end;
}
 
signed main(){
    int t;cin>>t;
    while(t--){
        int ans=0;
        int n;cin>>n;
        for(int i=0;i<n;i++){
            cin>>m[i].start>>m[i].end;
            m[i].end+=m[i].start;
        }
        sort(m,m+n,cmp);
        int temp=0;
        for(int i=0;i<n;i++){
            if(temp<=m[i].start){
                temp=m[i].end;
                ans++;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

问题 F: 最长单调递增子序列的长度

内存限制:128 MB时间限制:3.000 S

评测方式:文本比较命题人:外部导入

提交:415解决:150

返回比赛提交提交记录侧边提交

题目描述

请设计算法找出一个整数序列中最长单调递增子序列的长度。

输入

第一行为测试用例个数n,0<n≤1000。 第二行开始,每行为一个测试用例。每个测试用例由一组空格间隔的整数组成,第一个整数m为序列的长度,后面m个整数为序列内容,0<m≤1000。0≤ai≤1000

输出

对每个测试用例,输出其最长单调递增子序列的长度,每个输出占一行。

样例输入 复制

2
5 1 3 2 4 5
6 3 2 4 5 3 2

样例输出 复制

4
3

code 

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f
#define ll long long
#define int long long
#define MAX_SIZE 1005

int a[MAX_SIZE];
int dp[MAX_SIZE];

signed main(){
    int t;cin>>t;
    while(t--){
        int n;cin>>n;
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            cin>>a[i];
            dp[i]++;    //设初值为1:至少本身
        }
        int ans=0;
        for(int i=2;i<=n;i++){
            for(int j=1;j<=i-1;j++){
                if(a[j]<a[i]){
                    dp[i]=max(dp[j]+1,dp[i]);
                }
                if(dp[i]>ans){
                    ans=dp[i];
                }
            }
        }      
        //这里不是dp[n]!!假如a[n]=0,就是最小的  
        cout<<ans<<endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值