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,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,m;
signed main()
{
n=read(),m=read();
if (m==1) cout<<0;else cout<<n-m;
return 0;
//NOTICE LONG LONG!!!!!
}

  B:若将所有差是(p,q)的点对连接起来,显然会得到若干条链,链的数量即为答案。于是只要统计每种差的出现次数即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 55
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,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
typedef pair<int,int> pii;
int n,ans;
struct data{int x,y;
}a[N];
map<pii,int> f;
signed main()
{
n=read();
for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j)
{
ans=max(ans,++f[make_pair(a[i].x-a[j].x,a[i].y-a[j].y)]);
}
cout<<n-ans;
return 0;
//NOTICE LONG LONG!!!!!
}

  C:显然应该尽量加正数减负数。但同时容易发现至少有一个数要被减掉,至少有一个数要被加上,所以均为正数或均为负数时稍微修改一下。不妨设是排序后要将前p个数减掉,其他数加上。那么令a1依次减去ap+1~an-1,再令an依次减去a1~ap即可。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 100010
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,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[N];
signed main()
{
n=read();
for (int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+n+1);
int p=0;
for (int i=1;i<=n;i++) if (a[i]<0) p=i;
p=max(p,1);p=min(p,n-1);
//让前p个被减掉
int s=0;
for (int i=1;i<=p;i++) s-=a[i];
for (int i=p+1;i<=n;i++) s+=a[i];
cout<<s<<endl;
for (int i=p+1;i<n;i++)
{
printf("%d %d\n",a[p],a[i]);
a[p]-=a[i];
}
printf("%d %d\n",a[n],a[p]);a[n]-=a[p];
for (int i=1;i<p;i++)
{
printf("%d %d\n",a[n],a[i]);
a[n]-=a[i];
}
return 0;
//NOTICE LONG LONG!!!!!
}

  D:显然A到B和B到A的过程是独立的,分别最优化即可。显然就是做一个完全背包。需要注意的是第二次完全背包值域是5000*5000,且答案会爆int。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N (5010*5010)
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,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,a[2][3];
ll f[N];
ll solve(int x,int y,int n)
{
for (int i=0;i<=n;i++) f[i]=i;
for (int i=0;i<3;i++)
for (int j=a[x][i];j<=n;j++)
f[j]=max(f[j],f[j-a[x][i]]+a[y][i]);
return f[n];
}//有n元钱 从x买入 y卖出 最后最多能剩多少
signed main()
{
n=read();
for (int i=0;i<2;i++)
for (int j=0;j<3;j++)
a[i][j]=read();
cout<<solve(1,0,solve(0,1,n));
return 0;
//NOTICE LONG LONG!!!!!
}

  E:设f[i][j]为最大数是i且有j个时的方案数,尴尬的是转移需要用到最小值数量,并且无法记录。但注意到从最小值中挑一个和把一个数变成最大值之一的过程是一一对应的,所以在新增最大值时直接将贡献乘进去即可。那么上面的dp容易得到f[i][j]=f[i][j-1]*j,于是只要记录f[i][1]并转移。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 1000000010
#define N 1000010
#define P 1000000007
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,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int n,h,d,f[N],sum[N],s,t;
int ksm(int a,int k)
{
int s=1;
for (;k;k>>=1,a=1ll*a*a%P) if (k&1) s=1ll*s*a%P;
return s;
}
int inv(int a){return ksm(a,P-2);}
signed main()
{
n=read(),h=read(),d=read();
s=t=1;
for (int i=2;i<=n;i++)
{
t=1ll*t*i%P;
s=(s+t)%P;
}
f[0]=inv(s);sum[0]=f[0];
for (int i=1;i<=h;i++)
{
int u=(sum[i-1]-(i>d?sum[i-d-1]:0)+P)%P;
f[i]=1ll*u*s%P;
sum[i]=(sum[i-1]+f[i])%P;
}
for (int i=n;i>=1;i--) f[h]=1ll*f[h]*i%P;
cout<<f[h];
return 0;
//NOTICE LONG LONG!!!!!
}

  result:rank 98 rating +38

diverta 2019 Programming Contest 2的更多相关文章

  1. AtCoder diverta 2019 Programming Contest 2

    AtCoder diverta 2019 Programming Contest 2 看起来我也不知道是一个啥比赛. 然后就写写题解QWQ. A - Ball Distribution 有\(n\)个 ...

  2. 【AtCoder】diverta 2019 Programming Contest 2

    diverta 2019 Programming Contest 2 A - Ball Distribution 特判一下一个人的,否则是\(N - (K - 1) - 1\) #include &l ...

  3. 【AtCoder】diverta 2019 Programming Contest

    diverta 2019 Programming Contest 因为评测机的缘故--它unrated了.. A - Consecutive Integers #include <bits/st ...

  4. diverta 2019 Programming Contest

    A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 ...

  5. diverta 2019 Programming Contest 2自闭记

    A 签到(a-b problem不用贴了吧,以后atcoder小于300分题均不贴代码) B 发现选择的p,q一定是其中两点间的距离,于是可以O(n2)枚举两点,再O(n2)判断,其实可以做到O(n3 ...

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

    [AtCoder] NIKKEI Programming Contest 2019   本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder ...

  7. [AtCoder] Yahoo Programming Contest 2019

    [AtCoder] Yahoo Programming Contest 2019   很遗憾错过了一场 AtCoder .听说这场是涨分场呢,于是特意来补一下题. A - Anti-Adjacency ...

  8. 模拟赛小结:2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017)

    比赛链接:传送门 本场我们队过的题感觉算法都挺简单的,不知道为啥做的时候感觉没有很顺利. 封榜后7题,罚时1015.第一次模拟赛金,虽然是北欧的区域赛,但还是有点开心的. Problem B Best ...

  9. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...

随机推荐

  1. mysql 表联结,内部联结

    mysql> select * from user; +------+----------+-----------+ | id | name | address | +------+------ ...

  2. element ui 中的时间选择器怎么设置默认值/el-date-picker区间选择器怎么这是默认值

    template代码 <el-date-picker value-format="yyyy-MM-dd" v-model="search.date" ty ...

  3. mysql 为啥用b+ 树

    原因就是为了减少磁盘io次数,因为b+树所有最终的子节点都能在叶子节点里找见, 所以非叶子节点只需要存`索引范围和指向下一级索引(或者叶子节点)的地址` 就行了, 不需要存整行的数据,所以占用空间非常 ...

  4. nginx 平滑重启的实现方法

    一.背景 在服务器开发过程中,难免需要重启服务加载新的代码或配置,如果能够保证server重启的过程中服务不间断,那重启对于业务的影响可以降为0.最近调研了一下nginx平滑重启,觉得很有意思,记录下 ...

  5. 公司不用 Spring Boot,果断离职了!

    面试问到离职原因,我想这是很多面试者的痛,包括我自己,曾经也被离职原因所坑过. 面试回答离职原因简直特么就是巨坑,我也因此在微信公众号 "Java技术栈" 写了这篇文章<过了 ...

  6. Compute API 关键概念 详解

    Compute API 是 RESTful HTTP 服务,提供管理虚机的能力. 虚机可能有不同的内存大小,CPU数量,硬盘大小,能够在几分钟之内创建出来.和虚机的交互,可以通过Compute API ...

  7. winrunner 测试工具

    WinRunner在项目中的作用     (winrunner测试设计:http://blog.chinaunix.net/uid/301743/year-2013-list-81.html?/178 ...

  8. Linux配置crontab

    1. 添加任务(每分钟执行一次)crontab -e* * * * * /home/lings/logRotate.sh 2. 查看日志Jun 5 20:25:01 localhost CROND[8 ...

  9. Mac下 python2和python3共存

    一般是python2默认安装了,python3没有安装,这时候一般使用命令:brew install python3 进行安装 不同方法安装python的路径是不一样的,如下所示: 接下来就要看具体步 ...

  10. mac下安装face_recognition

    安装依赖库: 1.安装cmake (是一个跨平台的安装工具) brew install cmake 2.安装boost.boost-python(C++的程序库) brew install boost ...