2017 icpc 沈阳现场赛

博客围绕几道算法题目展开,如F Heron and His Triangle,发现满足条件的t数组递推式为t[i]=4*t[i-1]-t[i-2],因数值超long long需用大数,为避免超时可对询问排序;还涉及I Little Boxes的大数加法、K Rabbits的跳跃情况及L Tree的边可行性判断,并给出对应代码。

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

题目:链接

F Heron and His Triangle:

暴力跑了几发,把搞出来的数扔进oeis里发现对于条件成立的t数组

有t[i]=4*t[i-1]-t[i-2]。因此找到第一个大于等于N的t[i]就好了。

但是数值范围超过了long long,因此要用大数,这样一个个找

过去会超时,可以先对询问排序,这样下次的询问就可以接着

上次的位置寻找。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[105][33],c[105],ans[30003];
int T;
char t[105];
struct node
{
    int k[33],id;
}g[30003];
bool cmp(const node &x,const node &y)
{
    for(int i=32;i>=0;i--)
        if(x.k[i]!=y.k[i]) return x.k[i]<y.k[i];
}
void init()
{
    a[0][0]=4;a[1][0]=4;a[1][1]=1;
    for(int i=2;i<=100;i++)
    {
        int x=0;
        for(int j=0;j<=32;j++)
        {
            a[i][j]=4*a[i-1][j]-a[i-2][j]+x;
            if(a[i][j]>=0)
            {
                x=a[i][j]/10;
                a[i][j]%=10;
            }
            else
            {
                x=-1;
                a[i][j]=10+a[i][j];
            }
        }
    }
}
bool compare(int now,int i)
{
    for(int j=32;j>=0;j--)
        if(a[now][j]!=g[i].k[j])
        return a[now][j]>g[i].k[j];
    return 1;
}
void work()
{
    int now=0;
    for(int i=1;i<=T;i++)
    {
        while(!compare(now,i)) now++;
        ans[g[i].id]=now;
    }
}
int main()
{
    init();
    scanf("%d",&T);
    for(int i=1;i<=T;i++)
    {
        g[i].id=i;
        scanf("%s",&t);
        int len=strlen(t);
        for(int j=0;j<len;j++)
            g[i].k[j]=t[len-j-1]-'0';
    }
    sort(g+1,g+T+1,cmp);
    work();
    for(int i=1;i<=T;i++)
    {
        int id=ans[i],j=32;
        while(a[id][j]==0) j--;
        for( ;j>=0;j--) printf("%d",a[id][j]);
        printf("\n");
    }
    return 0;
}

I Little Boxes:

大数加法:

#include<bits/stdc++.h>
using namespace std;
int a[33],b[33];
char t[33];
void add()
{
    int c[33];
    memset(c,0,sizeof(c));
    int len=strlen(t+1);
    for(int i=1;i<=len;i++) c[i]=t[len-i+1]-'0';
    int k=0;
    for(int i=1;i<33;i++)
    {
        a[i]=a[i]+c[i]+k;
        k=a[i]/10;
        a[i]%=10;
    }
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        memset(a,0,sizeof(a));
        for(int i=1;i<=4;i++)
        {
            scanf("%s",t+1);
            add();
        }
        int id=32;
        while(id>1&&a[id]==0) id--;
        for( ;id>=1;id--) printf("%d",a[id]);
        printf("\n");
    }
    return 0;
}

K Rabbits:

只有a[1]~a[2]或a[n-1]~a[n]跳不到,其他都能跳到。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
int a[maxn];
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        int mi=min(a[2]-a[1]-1,a[n]-a[n-1]-1);
        //for(int i=2;i<=n;i++) mi=min(mi,a[i]-a[i-1]-1);
        printf("%d\n",a[n]-a[1]+1-n-mi);
    }
    return 0;
}

L Tree:

考虑一条边把整个图分成两部分,若这两部分的点的个数都大于k则这条边可行。

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
vector<int>G[maxn];
int n,k,son[maxn],ans;
void dfs(int v,int fa)
{
    son[v]=1;
    for(int i=0;i<G[v].size();i++)
    {
        int to=G[v][i];
        if(to==fa) continue;
        dfs(to,v);
        son[v]+=son[to];
        if(son[to]>=k&&n-son[to]>=k) ans++;
    }
}
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&k);
        for(int i=0;i<=n;i++) G[i].clear();
        ans=0;
        for(int i=1;i<n;i++)
        {
            int x,y;scanf("%d%d",&x,&y);
            G[x].push_back(y);
            G[y].push_back(x);
        }
        dfs(1,0);
        printf("%d\n",ans);
    }
    return 0;
}

 

### 2024年沈阳ICPC区域信息 #### 比时间和地点 关于2024年沈阳ICPC区域的具体日期尚未公布官方消息。然而,根据以往的比安排模式,可以推测该事通常会在每年的下半年举行[^1]。具体的时间表应关注官方网站或相关公告渠道获取最新通知。 对于比地点,按照惯例,沈阳站的比一般会设在当地知名高校内举办,如东北大学等院校曾作为承办方之一参与过此类活动组织工作。确切地址需等待主办方进一步确认并发布正式通告。 #### 参规则概述 国际大学生程序设计竞ICPC)有着严格的参规定: - **队伍组成**:每支参队由三名队员构成,在整个比中他们将共同解决一系列编程挑战问题。 - **语言支持**:允许使用的编程语言包括但不限于C++、Java 和 Python 等主流开发工具;具体的可用选项取决于当次比设定的支持列表[^2]。 - **解题方式**:题目将以英文形式给出,选手们需要通过编写高效算法来解决问题,并提交给在线评测系统进行验证。评判标准主要基于解答正确性和运行效率两方面考量。 - **其他注意事项**:严禁任何形式作弊行为的发生,一旦发现即刻取消成绩处理。此外,还可能有关于设备携带等方面的特殊指示,请务必仔细阅读最新的指南文件以确保准备充分[^3]。 ```cpp // 示例代码片段展示如何读取输入数据 #include <iostream> using namespace std; int main() { int n; cin >> n; // 输入整数n cout << "You entered: " << n << endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值