ACM ICPC 2017 Warmup Contest 2(ACM Northeastern European Regional Contest,Northern Subregion 2016)

本文回顾了ACM ICPC 2017 Warmup Contest中的两道题目,K. King's Heir和F. Folding。K. King's Heir通过创建新数据类型并排序解决,而F. Folding涉及幂次处理和归一化思想的应用。提醒读者在面对问题时,不要过于依赖直觉,有时枚举策略可能更有效。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第二场,并没有延续第一场的良好状态,当然,评测姬把spj吞了,也倒是一个方面先看看别的题吧

 K. King's Heir

思路:这题就是个简单的数据结构题,创建新数据类型,然后排序,将国王处理后加入一起排序,找到第一个比国王大的就好了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 110;

typedef struct KING
{
    int id;
    int day;
    int month;
    int year;
}King;

bool cmp(const King &a, const King &b)
{
    if(a.year > b.year)
    {
        return true;
    }
    else if(a.year == b.year)
    {
        if(a.month > b.month)
        {
            return true;
        }
        else if(a.month == b.month)
        {
            if(a.day > b.day)
            {
                return true;
            }
            else if(a.day == b.day)
            {
                if(a.id < b.id)
                {
                    return true;
                }
            }
        }
    }
    return false;
}

King k[maxn];

int main()
{
    while(scanf("%d%d%d",&k[0].day,&k[0].month,&k[0].year)!=EOF)
    {
        k[0].id = 0;
        k[0].year -= 18;
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&k[i].day,&k[i].month,&k[i].year);
            k[i].id = i;
        }
        sort(k,k+n+1,cmp);
        int person;
        for(person=0;person<=n;person++)
        {
            if(k[person].id==0)
            {
                break;
            }
        }
        if(person == n)
        {
            printf("-1\n");
        }
        else
        {
            printf("%d\n",k[person+1].id);
        }
    }
    return 0;
}

 F. Folding

思路:这题不难发现是个幂次处理问题,每个2的幂次作为一个分界点

关键还是归一化思想吧,幂次处理,将很多小细节整体处理

还有,有些时候还是不要想当然,你想的贪心策略未必是对的,如果有条件枚举,就枚举一下,ac就这样来了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>

using namespace std;

const int maxn = 1e5+10;

const double eps = 1e-6;

int t[40];

int getfold(int mab,int mib,int maa,int mia)
{
    if(mab<maa||mib<mia)
    {
        return 1e9;
    }
    else
    {
        int sum = 0;
        int mad = mab/maa;
        if(mab%maa > 0)
        {
            mad++;
        }
        for(int i=0;i<32;i++)
        {
            if(t[i] >= mad)
            {
                sum += i;
                break;
            }
        }
        int mid = mib/mia;
        if(mib%mia > 0)
        {
            mid++;
        }
        for(int i=0;i<32;i++)
        {
            if(t[i] >= mid)
            {
                sum += i;
                break;
            }
        }
        return sum;
    }
}

int main()
{
    int W,H,w,h;
    t[0] = 1;
    for(int i=1;i<32;i++)
    {
        t[i] = t[i-1]<<1;
    }
    while(scanf("%d%d%d%d",&W,&H,&w,&h)!=EOF)
    {
        int a = getfold(W,H,w,h);
        int b = getfold(W,H,h,w);
        int maxsum = min(a,b);
        if(maxsum == 1e9)
        {
            maxsum = -1;
        }
        //cout <<a<<b<<endl;
        printf("%d\n",maxsum);
    }
    return 0;
}

文章地址:http://blog.youkuaiyun.com/owen_q/article/details/78178543

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值