博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
diverta 2019 Programming Contest 2自闭记
阅读量:5250 次
发布时间:2019-06-14

本文共 3243 字,大约阅读时间需要 10 分钟。

A

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

B

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

#include
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
View Code

C

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

#include
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
=0){pos=i;break;} for(int i=2;i
View Code

D

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

#include
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);}
View Code

E

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

#include
#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1using 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
View Code

F

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

#include
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<
<<' '; cout<
View Code

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

转载于:https://www.cnblogs.com/hfctf0210/p/11029606.html

你可能感兴趣的文章
几道面试题
查看>>
Factory Design Pattern
查看>>
python中贪婪与非贪婪
查看>>
guava API整理
查看>>
无锁编程笔记
查看>>
jquery mobile
查看>>
如何在vue单页应用中使用百度地图
查看>>
Springboot使用步骤
查看>>
Spring属性注入
查看>>
Springboot-配置文件
查看>>
Springboot-日志框架
查看>>
P1192-台阶问题
查看>>
一、使用pip安装Python包
查看>>
spring与quartz整合
查看>>
Kattis之旅——Eight Queens
查看>>
3.PHP 教程_PHP 语法
查看>>
Duilib扩展《01》— 双击、右键消息扩展
查看>>
利用Fiddler拦截接口请求并篡改数据
查看>>
python习题:unittest参数化-数据从文件或excel中读取
查看>>
在工程中要加入新的错误弹出方法
查看>>