大一acmer日常记录day15

洛谷p1498:递归三部分

思路:对于一个大图形分解三个小图形,递归处理这三个小图形,当n为一时打出最小图形,开始回退,利用每个大图形的'/'划分为三部分,即三个递归入口

 代码:

# include <bits/stdc++.h>
using namespace std;
char mp[1030][2050];
int n;
void dfs(int x,int y,int deep)
{
    if(deep==1)//深度等于一时在字符数组中储存答案并返回
    {
        mp[x][y]='/';
        mp[x][y+1]='\\';
        mp[x+1][y-1]='/';
        mp[x+1][y]='_';
        mp[x+1][y+1]='_';
        mp[x+1][y+2]='\\';
        return;
    }
    dfs(x,y,deep-1);//上
    dfs(x+pow(2,deep-1),y-pow(2,deep-1),deep-1);//左
    dfs(x+pow(2,deep-1),y+pow(2,deep-1),deep-1);//右
}

int main ()
{
    int n;
    cin>>n;
   // memset(mp,' ',sizeof(mp));
   for(int i=1;i<=pow(2,n);i++){          //初始化
        for(int j=1;j<=pow(2,n+1);j++)
        mp[i][j]=' ';
    }
    dfs(1,pow(2,n-1)*2,n);
    for(int i=1;i<=pow(2,n);i++)
    {
        for(int j=1;j<=pow(2,n+1);j++)
    {
        cout<<mp[i][j];

    }
     cout<<endl;
    }

    return 0;
}

洛谷p2240:贪心

 思路:贪心的每次取性价比最高的物品,金币可以分割,所以把背包装满即可。对物品用结构体排序即可

代码:

# include <bits/stdc++.h>
using namespace std;
int dp[105][1005];
int n,v[105],m[105];
int t;
struct thing
{
    int m;
    int v;
    double ave=0.0;
}bag[105];
bool cmp(thing a,thing b)
{
    if(a.ave>b.ave)return 1;
    return 0;
}

int main ()
{
   // cin>>n>>t;
   scanf("%d%d",&n,&t);

    for(int i=1;i<=n;i++)
    {
        //cin>>m[i]>>v[i];
        scanf("%d%d",&bag[i].m,&bag[i].v);
        bag[i].ave=1.0*bag[i].v/bag[i].m;
    }
    sort(bag+1,bag+n+1,cmp);
    int sum=0;
    double ans=0.0;
    for(int i=1;i<=n;i++)
    {

        sum+=bag[i].m;
        ans+=bag[i].v;
        if(sum>t)
        {
            sum-=bag[i].m;
            ans-=bag[i].v;
            ans+=1.0*(t-sum)*bag[i].ave;
            break;
        }

    }
printf("%.2f",ans);
    return 0;
}
洛谷p1223:贪心

 思路:贪心策略:让打水时间少的先接水

代码:

# include <bits/stdc++.h>
using namespace std;
int sum[1005];
struct man
{
    int num;
    int time;
}people[1005];
bool cmp(man a,man b)
{
    if(a.time<b.time)return 1;
    return 0;
}
int main ()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        people[i].num=i;
        scanf("%d",&people[i].time);

    }
    sort(people+1,people+n+1,cmp);
    double ans=0;
    for(int i=1;i<=n;i++)
    {
         sum[i]=sum[i-1]+people[i].time;//求时间的前缀和
         printf("%d ",people[i].num);
    }
    printf("\n");
    for(int i=2;i<=n;i++)
    {
        ans+=sum[i-1];
    }
    printf("%.2f",ans/n);
    return 0;
}

 

洛谷p1803:贪心

 思路:贪心策略:先完成结束时间最短的比赛。用结构体排序即可

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct man
{
    ll start;
    ll ending ;
}game[100005];
bool cmp(man a,man b)
{
    if(a.ending <b.ending)return 1;
    return 0;
}
int main ()
{
        ll n;
        scanf("%lld",&n);
        for(ll i=1;i<=n;i++)
        {
            scanf("%lld %lld",&game[i].start,&game[i].ending );
        }
        sort(game+1,game+n+1,cmp);
       // for(int i=1;i<=n;i++)printf("%lld",game[i].ending);
        ll ans=1,sum=0;//sum表示对当前比赛,前面有几个比赛不符合要求
        for(int i=2;i<=n;i++)
        {
            if(game[i].start<game[i-1-sum].ending)
            {
                sum++;
                continue;
            }
            if(game[i].start>=game[i-1-sum].ending)
            {
                ans++;
                sum=0;//注意清零,每次以当前i为基准判断,初始是1为基准
            }
        }
        printf("%lld",ans);
    return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值