diverta 2019 Programming Contest 2自闭记

A

签到(a-b problem不用贴了吧,以后atcoder小于300分题均不贴代码)

B

发现选择的p,q一定是其中两点间的距离,于是可以O(n2)枚举两点,再O(n2)判断,其实可以做到O(n3)不过O(n4)就够了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,ans;
ll x[52],y[52];
int main()
{
    scanf("%d",&n);
    ans=n;
    for(int i=1;i<=n;i++)scanf("%lld%lld",&x[i],&y[i]);
    for(int i=1;i<n;i++)
    for(int j=i+1;j<=n;j++)
    {
        ll dx=x[i]-x[j],dy=y[i]-y[j];
        int sum=0;
        for(int k=1;k<=n;k++)
        {
            int flag=1;
            for(int l=1;l<=n;l++)if(x[k]-x[l]==dx&&y[k]-y[l]==dy){flag=0;break;}
            sum+=flag;
        }
        ans=min(ans,sum);
    }
    printf("%d\n",ans);
}

C

按照从小到大排成a1,a2,...,an,分类讨论:1、只有两个数直接相减。2、对于全是正的,显然应该先拿a1的减去除了an以外其他数,再用an减去该数,显然答案就是a2+a3+...+an-a1。对于全是负的,可以采用类似的方法。3、对于有正有负的,显然选出a1和an,a1减去除an外的正数,an减去除a1外的负数,再an-a1即可,答案就是所有数的绝对值

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+7;
int n,m,a[N],ax[N],ay[N];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    if(n==2)
    {
        printf("%d\n%d %d\n",a[2]-a[1],a[2],a[1]);
        return 0;
    }
    if(a[1]>=0)
    {
        for(int i=2;i<n;i++)ax[++m]=a[1],ay[m]=a[i],a[1]-=a[i];
        ax[++m]=a[n],ay[m]=a[1],a[n]-=a[1];
        printf("%d\n",a[n]);
        for(int i=1;i<=m;i++)printf("%d %d\n",ax[i],ay[i]);
        return 0;
    }
    if(a[n]<=0)
    {
        int ans=a[n];
        for(int i=1;i<n;i++)ans-=a[i];
        printf("%d\n",ans);
        for(int i=1;i<n;i++)printf("%d %d\n",a[n],a[i]),a[n]-=a[i];
        return 0;
    }
    int pos=0;
    for(int i=1;i<=n;i++)if(a[i]>=0){pos=i;break;}
    for(int i=2;i<pos;i++)ax[++m]=a[n],ay[m]=a[i],a[n]-=a[i];
    for(int i=pos;i<n;i++)ax[++m]=a[1],ay[m]=a[i],a[1]-=a[i];
    ax[++m]=a[n],ay[m]=a[1],a[n]-=a[1];
    printf("%d\n",a[n]);
    for(int i=1;i<=m;i++)printf("%d %d\n",ax[i],ay[i]);
}

D

发现只会做两轮交易,A->B,B->A,然后发现是个完全背包DP,并且第二次背包的容量是O(n2)的,于是就可以直接O(n2)DP结束了,感觉这个D比C简单吧。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5005;
int n,m,a[3],b[3];
ll ans,f[N*N];
int main()
{
    scanf("%d",&n);
    for(int i=0;i<3;i++)scanf("%d",&a[i]);
    for(int i=0;i<3;i++)scanf("%d",&b[i]);
    for(int i=0;i<3;i++)
    if(b[i]>a[i])
    for(int j=a[i];j<=n;j++)
    f[j]=max(f[j],f[j-a[i]]+b[i]-a[i]);
    for(int i=0;i<=n;i++)m=max(1ll*m,f[i]),f[i]=0;
    m+=n;
    for(int i=0;i<3;i++)
    if(a[i]>b[i])
    for(int j=b[i];j<=m;j++)
    f[j]=max(f[j],f[j-b[i]]+a[i]-b[i]);
    for(int i=0;i<=m;i++)ans=max(ans,f[i]);
    ans+=m;
    printf("%lld",ans);
}

E

考后5min写出来,简直自闭……早知道不去写F的打表程序还没跑出来……就是每次移动总是min->max,然后f[i]表示max为i时的方案数,显然对于多个max的可以变换成x!种(x为max的人数),然后求一个阶乘前缀和即可。注意最后f[n]不要求。

#include<bits/stdc++.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int N=1e6+7,mod=1e9+7;
int n,d,h,f[N],fac[N],inv[N],sf[N],s[N<<2];
int qpow(int a,int b)
{
    int ret=1;
    while(b)
    {
        if(b&1)ret=1ll*ret*a%mod;
        a=1ll*a*a%mod,b>>=1;
    }
    return ret;
}
void update(int k,int v,int l,int r,int rt)
{
    if(l==r){s[rt]=v;return;}
    int mid=l+r>>1;
    if(k<=mid)update(k,v,lson);
    else update(k,v,rson);
    s[rt]=(s[rt<<1]+s[rt<<1|1])%mod;
}
int query(int L,int R,int l,int r,int rt)
{
    if(L<=l&&r<=R)return s[rt];
    int mid=l+r>>1,ret=0;
    if(L<=mid)ret+=query(L,R,lson);
    if(R>mid)ret+=query(L,R,rson);
    return ret%mod;
}
int main()
{
    scanf("%d%d%d",&n,&h,&d);
    fac[0]=1;for(int i=1;i<=n;i++)fac[i]=1ll*fac[i-1]*i%mod;
    for(int i=1;i<=n;i++)sf[i]=(sf[i-1]+fac[i])%mod;
    update(0,fac[n],0,h,1);
    for(int i=1;i<=h;i++)
    {
        f[i]=query(max(0,i-d),i-1,0,h,1);
        if(i<h)f[i]=1ll*f[i]*sf[n]%mod,update(i,f[i],0,h,1);
    }
    printf("%d",f[h]);
}

F

好吧,看了网上程序,差不多是构造个近似fib数列的玩意,把表抄上也没管了……

#include<bits/stdc++.h>
using namespace std;
long long a1[13]={1,2,4,7,12,20,29,38,52,101},a2[13]={1,2,4,7,12,20,30,39,67,101};
long long n,w=1,mp[15][15];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)mp[i][i]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)mp[i][j]=mp[j][i]=w*a1[j-i-1];
        w*=a2[n-i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)cout<<mp[i][j]<<‘ ‘;
        cout<<endl;
    }
}

result:rank101 rating+=58,精准地没进前100……

原文地址:https://www.cnblogs.com/hfctf0210/p/11029606.html

时间: 2024-07-30 14:00:08

diverta 2019 Programming Contest 2自闭记的相关文章

【AtCoder】diverta 2019 Programming Contest

diverta 2019 Programming Contest 因为评测机的缘故--它unrated了.. A - Consecutive Integers #include <bits/stdc++.h> #define fi first #define se second #define pii pair<int,int> #define mp make_pair #define pb push_back #define space putchar(' ') #define

diverta 2019 Programming Contest

AB 签到(A是a-b problem就不放code了) #include<bits/stdc++.h> using namespace std; int r,g,b,n,ans; int main() { cin>>r>>g>>b>>n; for(int i=0;i*r<=n;i++) for(int j=0;i*r+j*g<=n;j++) if((n-i*r-j*g)%b==0)ans++; cout<<ans<

diverta 2019 Programming Contest 2

A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;} int gcd(int n

AtCoder Grand Contest 030 自闭记

A:阅读. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; #define ll long long char getc(){char c=getchar();while ((c<'A'||c>'Z')&&a

2020-3-14 acm训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019 解题报告+补题报告

2020-3-15比赛解题报告+2020-3-8—2020-3-15的补题报告 2020-3-15比赛题解 训练联盟周赛Preliminaries for Benelux Algorithm Programming Contest 2019  A建筑(模拟) 耗时:3ms 244KB 建筑 你哥哥在最近的建筑问题突破大会上获得了一个奖项 并获得了千载难逢的重新设计城市中心的机会 他最喜欢的城市奈梅根.由于城市布局中最引人注目的部分是天际线, 你的兄弟已经开始为他想要北方和东方的天际线画一些想法

[AtCoder] NIKKEI Programming Contest 2019 (暂缺F)

[AtCoder] NIKKEI Programming Contest 2019 ??本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder. A - Subscribers ??首先始终 \(max = \min(A, B)\) ,\(min\) 的话如果 \(A + B \leq N\) ,那么就是 \(0\) ,否则就是 \(A + B - N\) . int n, a, b; int main() { read(n), read

ZOJ 3703 Happy Programming Contest(0-1背包)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3703 Happy Programming Contest Time Limit: 2 Seconds      Memory Limit: 65536 KB In Zhejiang University Programming Contest, a team is called "couple team" if it consists of only two s

Happy Programming Contest zoj3703 dp

Description In Zhejiang University Programming Contest, a team is called "couple team" if it consists of only two students loving each other. In the contest, the team will get a lovely balloon with unique color for each problem they solved. Sinc

XNA Game Studio 4.0 Programming 随便读,随便记 &ldquo;Game Class&rdquo;

XNA 中的 Game 类,是所有神奇事情发生的地方.几乎游戏中所有的事情都由它来操办. 它是项目中的王者,让我们深入窥探一番: 虚方法 Game 本身从众多其它地方继续了许多能力才能完成游戏中的事情.因而它必然会重写一些方法, 以更好地完成任务.我们已经看到了一些: Initialize ,如你所见,这个方法在Game类自身创建后,调用一次.在这里你可 以执行一些初始化游戏的动作,比如加载游戏的其它组件. Update ,这个方法,顾名思义,就是用来更新的.你可以在这里执行游戏状态的 更新.比