10-30上午测试(DAY 2 R1)

本文提供了两道算法竞赛题目的详细解答过程,包括动态规划、贪心算法等核心思想的应用,并附带完整代码实现。

T1
暴力70
正解DP+贪心(QAQ)
本来写对了,理解错题意了。
DP[i][j]表示跳了i个楼,目前在j楼的最小花费。
首先我们的DP是从1->n的。
那么我们会想顺序会不会产生影响。
显然是会的
比如 1高度3 2为1 3为3
顺序跳显然不如1->3->2优。
所以先把楼按照高度升序或者降序排列。


显然dp[0][i]=c[i]
转移dp[i][j]可以从1->(j-1)中转移而来
dp[i][j]=min(dp[i-1][k]+h[j]-h[k])

最后倒着扫数组,看看<=t的最大i为几.
最后一定要跳到地上。。。。。。。
WTF.

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct node{
    int h,c;
}a[60];
int n,t,ans;
int dp[60][60];
int abs(int x)
{
    if(x<0) x=-x;
    return x;
}
bool comp(node x,node y)
{
    return x.h<y.h;
}
int main()
{
    //freopen("meet.in","r",stdin);
    memset(dp,127/3,sizeof(dp));
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
     scanf("%d",&a[i].c);
    for(int i=1;i<=n;i++)
     scanf("%d",&a[i].h);
    scanf("%d",&t);
    sort(a+1,a+n+1,comp);
    for(int i=1;i<=n;i++) dp[0][i]=a[i].c;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            for(int k=1;k<j;k++)
                dp[i][j]=min(dp[i][j],dp[i-1][k]+a[j].h-a[k].h);
            dp[i][j]+=a[j].c;
        }

    for(int i=n;i>=1;i--)
     for(int j=1;j<=n;j++) 
      if(dp[i][j]<=t)
      {
        printf("%d\n",i+1);
        return 0;
      }
    printf("0");
    //printf("%d\n",ans);

    return 0;
} 

T2 暴力搜索30
正解(我TM也不知道叫啥)
答案为a数组
输入的为b数组。
b数组的顺序不会产生影响。
先把b排序
由于a是升序排列的
显然有
a1+a2=b1
a1+a3=b2
但是 a2+a3=?
无法判断
假设a2+a3=b[x]
我们可以确定出a1,a2,a3的具体值。
然后通过枚举没有被造出来的b与a1来确定一个a值。
再用这个值去筛去可以组合出的b值
这样找,直到找出n个符合条件的数。
字典序?
b从小到大
那么a1就是从大到造出来的。符合要求

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxm=310;
int a[maxm],b[maxm*maxm],ans[maxm][maxm];
int cnt,n,m;
bool used[maxm*maxm];
void get(int x)
{
    memset(used,0,sizeof(used));
    memset(a,0,sizeof(a));
    if((b[1]+b[2]+b[x])%2) return;
    a[1]=(b[1]+b[2]+b[x])/2-b[x];
    a[2]=b[1]-a[1];
    a[3]=b[2]-a[1];
    used[1]=used[2]=used[x]=1;
    //printf("%d %d %d\n",a[1],a[2],a[3]);
    for(int i=4,j=3;i<=n;i++)
    {
        while(j<=m&&used[j]) j++;
        if(j>m) return;
        a[i]=b[j]-a[1];
        used[j]=1;
        for(int k=2;k<i;k++)
        {
            if(a[k]>a[i]) return;
            int B=a[i]+a[k];//造出来的B数
            int pos=lower_bound(b+1,b+m+1,B)-b;//第一个位置
            if(b[pos]!=B) return;//没这个数返回
            int poi=pos;
            while(poi<=m&&b[pos]==b[poi]&&used[poi])
             poi++;
            if(b[poi]!=b[pos]||used[poi]) return;//没找到没变出来过的数
            used[poi]=1; 
        }
    }
    cnt++;
    for(int i=1;i<=n;i++)
     ans[cnt][i]=a[i];
}
int main()
{
    freopen("city.in","r",stdin);
    //freopen("city.out","w",stdout);
    scanf("%d",&n);

    m=(n*(n-1))/2;

    for(int i=1;i<=m;i++)
     scanf("%d",b+i);
    sort(b+1,b+m+1);
    for(int i=3;i<=m;)
     {
        //printf("%d ",i);
        get(i);
        int j=i;
        while(j<=m&&b[i]==b[j]) j++;
        i=j;
     }
    printf("%d\n",cnt);
    for(int i=1;i<=cnt;i++)
    {
        for(int j=1;j<=n;j++)
         printf("%d ",ans[i][j]);
        puts("");
    }

    return 0; 
}

T3等待填坑。。。。

2.1黑盒测试 2.1.1 实验目的   (1) 能熟练应用黑盒测试技术进行测试用例设计;   (2) 对测试用例进行优化设计; 2.1.2 实验设备   主流 PC 机一套,要求安装windows 操作系统和Office 工具。 2.1.3 实验内容 题目一:日期问题   用决策表测试法测试以下程序:该程序三个输入变量monthdayyearmonthdayyear均为整数值,并且满足:1800≤year2020,1month121day≤31),分别作为输入日期的月份、日、年份,通过程序可以输出该输入日期在日历上前一天的日期。例如,输入2004 年1129 日,则该程序的输出为2004 年1128 日。   (1) 分析各种输入情况,列出为输入变量 monthdayyear 划分的有效等价类。   (2) 分析程序的规格说明,并结合以上等价类划分的情况,给出问题规定的可能采取的操作(即列出所有的动作桩)。   (3) 根据 (1)(2) ,画出简化后的决策表。 划分等价类(此处只考虑了有效等价类),基本思想是根据三个输入项的取值来划分,首先三个输条件都是整数,然后确定边界值,month[112],day[1,31],year[1800,2020],再来划分等价类,条件依据是:闰年的2月是29天,非闰年的2月时28天,{1,3,5,7,8,1012}月份是31天,{2,4,6,9,11}月份是30天 等价类 Year Month Day 有效等价类 Y1:[1800,2020]且为闰年 M12 D127 Y2:[1800,2020]不为闰年 M21,3,5,7,8, 10, D228 M3:2,4,6,9,11 D3 :29 M4:12 D4 :30 D4 :31 所有动作桩(弱组合形式) 测试用例ID 测试用例的等价类构成 001 Y1 M1 D1 002 Y2 M2 D2 003 Y1 M3 D3 004 Y2 M4 D4 005 Y1 M1 D5 强组合形式有2*3*5=30种。 决策表 Year Y1,Y2 Y1,Y2 Y1,Y2 Y1,Y2 Y1,Y2 Y1,Y2 Y1 Y2 Y1 Y2 Y1,Y2 Y1,Y2 Month M1,M4 M1 M2 M2 M2 M3 M3 M3 M3 M3 M3 M4 Day D1-D4 D5 D1-D3 D4 D5 D1 D2 D2 D3 D3 D4,D5 D5 Day+1 ▲ ▲ ▲ ▲ Day=1 ▲ ▲ ▲ ▲ ▲ Month+1 ▲ ▲ ▲ ▲ Month=1Year+1Year not exist ▲ ▲
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值