【hdu】 5640 , 5641 , 5642 , 5643 (BestCoder Round #75)

五道题只写出了现场只写出两道题,orz

hdu 5640

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5640
题意:阅兵式前一天,是国王的生日,大臣们为他准备了一个 n×m(1≤n,m≤10000) 的蛋糕。他准备切蛋糕,但他切蛋糕有奇奇怪怪的癖好,他每次只切一刀,且必须切下一个正方形蛋糕。请问它最多能切出多少个正方形蛋糕?
题解:很水的题,不断的交替模和除就可以。
代码:

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
int T,n,m,ans;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        ans=0;
        scanf("%d%d",&n,&m);
        if (n>m)
        swap(n,m);
        while(n)
        {
            ans+=m/n;
            m=m%n;
            if (n>m)
            swap(n,m);
        }
        printf("%d\n",ans);
    }
}

hdu5641

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5641
题意:阅兵式上,国王见到了很多新奇东西,包括一台安卓手机。他很快对手机的图形解锁产生了兴趣。

解锁界面是一个 3×3 的正方形点阵,第一行的三个点标号 1,2,3,第二行的三个点标号 4,5,6,第三行的三个点标号 7,8,9。密码本身是一段序列,表示经过点的先后顺序,但遵循如下规则:

  1. 密码至少经过四个点。

  2. 不能重复经过同一个点。

  3. 路径上的中间点不能跳过,除非已经被经过(3427 是合法的,但 3724不合法)。

他想设置的密码的长度为正整数 k(1≤k≤9),密码序列为 s1s2…sk(0≤si< INT_MAX),他想知道这个密码序列是否合法,这个问题交给了你。
题解:超级大模拟,注意各种细节和数据的坑人之处,比赛时被坑wa了四次。
题意:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int T,k,a[15],flag;
int vis[10];
int x[10][10];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        flag=0;
        scanf("%d",&k);
        x[1][3]=2;x[3][1]=2;
        x[4][6]=5;x[6][4]=5;
        x[7][9]=8;x[9][7]=8;
        x[1][7]=4;x[7][1]=4;
        x[1][9]=5;x[9][1]=5;
        x[3][7]=5;x[7][3]=5;
        x[3][9]=6;x[9][3]=6;
        x[2][8]=5;x[8][2]=5;

        memset(vis,0,sizeof(vis));
        for (int i=1;i<=k;i++)
        {
            scanf("%d",&a[i]);
            if (a[i]<=0 || a[i]>9) flag=1;
                }
        if (k>9 || k<4)
                {
                        printf("invalid\n");
                        continue;
                }
        if (flag==1)     
        {
            printf("invalid\n");
            continue;
        }
        vis[a[1]]=1;
        vis[0]=1;   

        for (int i=2;i<=k;i++)
        if (vis[x[a[i]][a[i-1]]]==1&&vis[a[i]]==0)
        vis[a[i]]=1;
        else flag=1;

        if (flag) printf("invalid\n");
        else printf("valid\n");
    }
}

hdu5642

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5642
题意:国王演讲后士气大增,但此时战争还没有结束,国王时不时要下发命令。

由于国王的口吃并没有治愈,所以传令中可能出现:“让第三军-军-军,到前线去” 这样的命令。由于大洋国在军队中安插了间谍 , 战事紧急,很多时候前线的指挥官不能分清哪些命令真正来自国王。但国王的命令有一个特点,他每次连续重复的字符最多 3 次. 所以说他的命令中没有:“让第三军-军-军-军 , 到前线去”,但是可以有 :“让第三军-军 , 到前线去” 。

此时将军找到了你,你需要告诉他,给定命令的长度长度为 n,有多少种不同的命令可以是国王发出的 。(也就是求长度为 n 的合格字符串的个数)当然,国王可能说出一句话没有犯任何口吃,就像他那次演讲一样。

为了简化答案,国王的命令中只含有小写英文字母,且对答案输出模 1000000007。

我们认为两个命令如果完全相同那么这两个字符串逐个比较就完全相同。

题解:题目扯这么多,其实是问存在多少长度为n的字符串符合字符串中最多只有三个连续相同的字符,当时看到题以为是推出一个数学公式,结果推出来之后发现错了。。还是dp比较靠谱。
二维dp,dp[ i ][ j ] 表示长度为 i 的符合条件字符串 且 后j位为相同字母的字符串的个数。

题解:

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#define mmod (1000000007)
using namespace std;
int T,n,m;
long long dp[2005][4];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        memset(dp,0,sizeof(dp));
        dp[1][1]=26;
        for (int i=2;i<=n;i++)
        for (int j=1;j<=3;j++)
        {
            dp[i][j]=dp[i-1][j-1];
                        dp[i][1]+=dp[i-1][j]*25;
                        dp[i][1]%=mmod;
        }
        long long ans=(dp[n][1]+dp[n][2]+dp[n][3])%mmod;
//      printf("%I64d\n",ans);
        cout<<ans<<endl;
    }
}

hdu5643

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5643
题意:为了铭记历史,国王准备在阅兵的间隙玩约瑟夫游戏。它召来了 n(1≤n≤5000)n(1\le n\le 5000)n(1≤n≤5000) 个士兵,逆时针围成一个圈,依次标号 1,2,3…n1, 2, 3 … n1,2,3…n。

第一轮第一个人从 1 开始报数,报到 1 就停止且报到 1的这个人出局。

第二轮从上一轮出局的人的下一个人开始从 1 报数,报到 2 就停止且报到 2的这个人出局。

第三轮从上一轮出局的人的下一个人开始从 1 报数,报到 3 就停止且报到 3的这个人出局。

第 n−1 轮从上一轮出局的人的下一个人开始从 1 报数,报到 n−1 就停止且报到 n−1 的这个人出局。

最后剩余的人是幸存者,请问这个人的标号是多少?

题解:
摘自bc官网
这里写图片描述
这里写图片描述
代码日后再附。。。ovo

其实还有一道费用流的题,但还没正式学图论,所以就不写了,还是太菜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,NURBS(非均匀有理B样条)是一种强大的数学工具,用于表示和处理复杂的曲线和曲面。NURBS在计算机图形学、CAD(计算机辅助设计)、CAM(计算机辅助制造)等领域有着广泛的应用。下面将详细探讨MATLAB中NURBS的绘制方法以及相关知识点。 我们需要理解NURBS的基本概念。NURBS是B样条(B-Spline)的一种扩展,其特殊之处在于引入了权重因子,使得曲线和曲面可以在不均匀的参数空间中进行平滑插值。这种灵活性使得NURBS在处理非均匀数据时尤为有效。 在MATLAB中,可以使用`nurbs`函数创建NURBS对象,它接受控制点、权值、 knot向量等参数。控制点定义了NURBS曲线的基本形状,而knot向量决定了曲线的平滑度和分布。权值则影响曲线通过控制点的方式,大的权值会使曲线更靠近该点。 例如,我们可以使用以下代码创建一个简单的NURBS曲线: ```matlab % 定义控制点 controlPoints = [1 1; 2 2; 3 1; 4 2]; % 定义knot向量 knotVector = [0 0 0 1 1 1]; % 定义权值(默认为1,如果未指定) weights = ones(size(controlPoints,1),1); % 创建NURBS对象 nurbsObj = nurbs(controlPoints, weights, knotVector); ``` 然后,我们可以用`plot`函数来绘制NURBS曲线: ```matlab plot(nurbsObj); grid on; ``` `data_example.mat`可能包含了一个示例的NURBS数据集,其中可能包含了控制点坐标、权值和knot向量。我们可以通过加载这个数据文件来进一步研究NURBS的绘制: ```matlab load('data_example.mat'); % 加载数据 nurbsData = struct2cell(data_example); % 转换为cell数组 % 解析数据 controlPoints = nurbsData{1}; weights = nurbsData{2}; knotVector = nurbsData{3}; % 创建并绘制NURBS曲线 nurbsObj = nurbs(controlPoints, weights, knotVector); plot(nurbsObj); grid on; ``` MATLAB还提供了其他与NURBS相关的函数,如`evalnurbs`用于评估NURBS曲线上的点,`isoparm`用于生成NURBS曲面上的等参线,以及`isocurve`用于在NURBS曲面上提取特定参数值的曲线。这些工具对于分析和操作NURBS对象非常有用。 MATLAB中的NURBS功能允许用户方便地创建、编辑和可视化复杂的曲线和曲面。通过对控制点、knot向量和权值的调整,可以精确地控制NURBS的形状和行为,从而满足各种工程和设计需求。通过深入理解和熟练掌握这些工具,可以在MATLAB环境中实现高效的NURBS建模和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值