大一acmer日常记录day7

洛谷P2241:

 思路:

正方形个数

边长为1 个数n*m

边长为2 个数(n-1)*(m-1)

边长为3 个数(n-2)*(m-2)

所以 边长为min{n,m} 个数(m-min{n,m}+1)*(n-min{n,m}+1)

长方形加正方形个数

total=(1+2+3+…+n)*(1+2+3+…+m)

=((1+n)*(1+m)*n*m)/4

长方形个数

上面两式相减即可得出

所以思路就是 先算出正方形个数 然后用公式得出长方形和正方形个数总和 最后得到长方形个数

代码:

#include <bits/stdc++.h>
using namespace std;
long long n,m,a,b,sum=0,t,chang;

int main ()
{
    cin>>n>>m;
   a=n,b=m,sum=n*m,t=0,chang=0;
   //zheng:
 
   while(a!=0&&b!=0)
   {
       a--;
       b--;
       sum+=a*b;
   }
   //quan:total=(1+2+3+…+n)*(1+2+3+…+m)=((1+n)*(1+m)*n*m)/4
   t=((1+n)*(1+m)*n*m)/4;
   //chang
   chang=t-sum;
   cout<<sum<<" "<<chang;
    return 0;
}

洛谷p1706全排列:

 

#include <bits/stdc++.h>
using namespace std;
int n;
int num[100];
int b[10];//标记数组
void dfs(int t,int j)//t:个数,j:下标
{
    if(t==n)
    {
        for(int i=0;i<n;i++)
        {
            printf("%5d",num[i]);
        }
        printf("\n");
        return ;
    }
    for(int i=1;i<=n;i++)
    {
        if(b[i]==0)
        {
            num[j]=i;
            b[i]=1;//标记i已经使用
            dfs(t+1,j+1);
            b[i]=0;//标记i未使用
        }else continue;
    }
}
int main ()
{
    scanf("%d",&n);
    dfs(0,0);
    return 0;
}
 

洛谷p1157:组合经典

 

#include <bits/stdc++.h>
using namespace std;
int num[25];
int n,r;
void dfs(int a,int start)//a:个数,start:起始值
{
    if(a==r)
    {
        for(int i=0;i<r;i++)
        {
            printf("%3d",num[i]);
        }
        printf("\n");
        

    }
    for(int i=start;i<=n;i++)
    {
        num[a]=i;
        dfs(a+1,i+1);//使得num数组元素升序排列,去重
    }

}

int main ()
{

    scanf("%d%d",&n,&r);
    dfs(0,1);

    return 0;
}
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值