LI

/*
没有考虑次大值有大于一个的情况
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 1000007 using namespace std;
int n,m,ans,cnt,mx;
int a[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
// freopen("multiset.in","r",stdin);
// freopen("multiset.out","w",stdout);
n=read();
for(int i=;i<=n;i++)
{
a[i]=read();mx=max(mx,a[i]);
}
for(int i=;i<=n;i++) if(a[i]==mx) cnt++;
for(int i=;i<=n;i++) if((<<i)>cnt){ans=i;break;}
printf("%d\n",ans+mx);
return ;
}

80分

/*
扩展不好思考,考虑缩小这些序列。
如果是零就尽量合并,如果非零就都减一。
计数排序O(n) a[0]=(a[0]+1)/2 赋值在a[1]上。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define N 1000010 using namespace std;
int n,res,lim;
int a[N],cnt[N]; int main()
{
freopen("multiset.in","r",stdin);
freopen("multiset.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
lim=max(lim,a[i]);
cnt[a[i]]++;
}
int l=,z=cnt[];
for(int i=;i<=lim;i++)
{
res++;
z=(z+)/;z+=cnt[i];
}
for(;z>;z=(z+)/)res++;
printf("%d",res);
return ;
}

#include<cstdio>
#include<cstring>
const int maxn=1e5+;
const int maxm=5e5+;
inline int min_(int x,int y)
{
return x<y?x:y;
}
inline int max_(int x,int y)
{
return x>y?x:y;
}
int n,m,l,ans;
int t[maxn];
int h[maxn],hs;
int et[maxm],en[maxm];
bool v[maxn];
void add()
{
int u,v;
scanf("%d%d",&u,&v);
hs++,et[hs]=v,en[hs]=h[u],h[u]=hs;
}
void dfs(int k,int in,int ax)
{
if(k==n)
{
t[ax]=max_(t[ax],in);
return;
}
for(int i=h[k]; i; i=en[i]) if(!v[et[i]]) v[et[i]]=,dfs(et[i],min_(in,i),max_(ax,i)),v[et[i]]=;
}
int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=; i<=m; i++) add();
dfs(,1e9,);
ans=l=;
for(int i=; i<=m; i++) if(t[i]>=l)
{
l=i;
ans++;
}
printf("%d\n",ans);
return ;
}

20乱搞

/*
考虑这样一个问题:平面上n个点,分成尽量少的点编号连续的点集,使得点集内任意两点的距离不超过一个指定值L。 因为能选尽量选,所以可以考二分下一个断开的位置,但极限数据可以卡掉。 那么这个题我们可以考虑把这个二分变形。
考虑一开始是Start,想找一个start+delta,操作次数尽量小。
有一个办法是delta开始是100,再变成200,300......然后就可以减少二分次数。
最好做法是:delta,1,2,4,8倍增思想。当2^p联通时,2^(p-1)<=delta<=^p。在这个区间内再去做二分。
复杂度sum(O(delta*log))=O(m*log)。 也可以增量法
还是那个模型,但delta->delta+1
vis[i]表示1到i是否可达。多了一条边时,从x->y本来vis[x]=0就不管他,vis[y]=1就不管他。当vis[y]=0 && vis[x]=1才去bfs。
每条边都最多访问一次,总时间复杂度O(m)。 */
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N=;
typedef long long ll; int n, m;
int vis[N], u[N], v[N];
vector<int> vec[N]; bool dfs(int u)
{
if (vis[u]) return false;
if (u == n) return true;
vis[u] = ;
bool ret = false;
for (int i = ; i < vec[u].size(); i++)
{
ret = dfs(vec[u][i]);
if (ret) return true;
}
return false;
} int read()
{
char ch = getchar();
int x = ;
while (!isdigit(ch)) ch = getchar();
while (isdigit(ch)) {x = x*+(ch-'');ch=getchar();}
return x;
} bool check(int sta, int las)
{
for (int i = sta; i <= las; i++)
vec[u[i]].push_back(v[i]); bool ret = dfs(); for (int i = sta; i <= las; i++)
{
vis[u[i]] = vis[v[i]] = ;
vec[u[i]].clear();
}
vis[] = ;
return ret;
} int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
n = read(), m = read();
for (int i = ; i < m; i++)
{
//scanf("%d%d", &u[i], &v[i]);
u[i] = read(); v[i] = read();
}
int now = , ans = ;
while (now < m)
{
int i;
for (i = ; i + now <= m; i <<= )
if (check(now, now + i - )) break;
i >>= ;
int nowtmp = now + i;
for (; i > ; i >>= )
if (nowtmp + i <= m && !check(now, nowtmp + i - ))
nowtmp += i;
ans++;
now = nowtmp; }
cout << ans << endl;
}

Std1

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N=;
typedef long long ll; int n, m;
int vis[N], u[N], v[N];
vector<int> vec[N]; bool dfs(int u)
{
if (vis[u]) return false;
if (u == n) return true;
vis[u] = ;
bool ret = false;
for (int i = ; i < vec[u].size(); i++)
{
ret = dfs(vec[u][i]);
if (ret) return true;
}
return false;
} bool check(int sta, int las)
{
for (int i = sta; i <= las; i++)
vec[u[i]].push_back(v[i]); bool ret = dfs(); for (int i = sta; i <= las; i++)
{
vis[u[i]] = vis[v[i]] = ;
vec[u[i]].clear();
}
vis[] = ;
return ret;
} int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
scanf("%d%d", &n, &m);
for (int i = ; i < m; i++)
scanf("%d%d", &u[i], &v[i]);
int now = , ans = ;
while (now < m)
{
int i;
for (i = ; i + now <= m; i <<= )
if (check(now, now + i - )) break;
i >>= ;
int nowtmp = now + i;
for (; i > ; i >>= )
if (nowtmp + i <= m && !check(now, nowtmp + i - ))
nowtmp += i;
ans++;
now = nowtmp; }
cout << ans << endl;
}

std2

/*
十分贪心
觉得一定是找序列中最小的奇数把它减一最优,如果最小的是偶数,就不管他。
出题人说卡贪心,于是只有十分emmm
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define N 1007
#define inf 0x3f3f3f3f using namespace std;
int n,m,ans,cnt;
int a[N]; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} int main()
{
int T;T=read();
while(T--)
{
n=read();m=n;ans=;
for(int i=;i<=n;i++) a[i]=read();cnt=;
while(m)
{
cnt++;sort(a+,a+n+);
if(cnt&)
{
if(a[]==)a[]=inf,ans++,m--;
else if(a[]&) a[]--;
else continue;
}
else
{
for(int i=;i<=n;i++)
{
a[i]--;
if(a[i]==) m--,a[i]=inf;
}
}
}
printf("%d\n",ans);
}
}
/*
最理想的情况是1,2,3,4......。可以强行攻击把血量变成这种情况。
但对于有些相同的,就要特殊考虑
比如5,5,5,5,5,
看做1,2,3,4,5
代价就是4,3,2,1,0。
考虑dp。设f[i][j]:考虑到血量为i的兵前面操作中省下了j刀的最大答案。c[i]表示代价。f[i][j[=max(f[i-1][j-1],f[i-1][j+c[i]]+1)。据说是背包dp模型。
对于c的处理可以计数排序。
但有一个问题,2,4,5,5时
5->1而不是3。用栈维护。
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std; const int MAXN = + ;
int a[MAXN];
int cnt[MAXN], sta[MAXN], c[MAXN];
int f[MAXN][MAXN]; int main()
{
freopen("cs.in", "r", stdin);
freopen("cs.out", "w", stdout);
int T;
scanf("%d", &T);
for (int num = ; num <= T; ++num)
{
int N, maxn = ;
scanf("%d", &N);
memset(cnt, , sizeof(cnt));
memset(c, , sizeof(c));
memset(f, , sizeof(f));
for (int i = ; i <= N; ++i)
{
scanf("%d", &a[i]); ++cnt[a[i]];
maxn = max(maxn, a[i]);
}
int top = ;
for (int i = ; i <= maxn; ++i)
if (cnt[i] == ) sta[++top] = i; else
{
while (cnt[i] > && top > ) {c[sta[top--]] = i; --cnt[i];}
c[i] = i;
} int ans = ;
for (int i = ; i <= maxn; ++i)
for (int j = ; j <= i; ++j)
{
if (j > ) f[i][j] = f[i - ][j - ];
if (c[i] != && j + c[i] - i < i)
f[i][j] = max(f[i][j], f[i - ][j + c[i] - i] + );
ans = max(ans, f[i][j]);
}
printf("%d\n", ans);
}
return ;
}

清北考前刷题day4早安的更多相关文章

  1. 清北考前刷题day7早安

  2. 清北考前刷题day6早安

    #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #d ...

  3. 清北考前刷题day5早安

    /* C(n,k) */ #include<iostream> #include<cstdio> #include<cstring> #define ll long ...

  4. 清北考前刷题day4下午好

    /* 辗转相除,每次计算多出现了几个数. */ #include<iostream> #include<cstdio> #include<cstring> #inc ...

  5. 清北考前刷题day2早安

    /* 做法一:按h sort一遍,对于一段区间[i,j],高度花费就是h[j]-h[i] 然后枚举区间,把区间内C排序,一个一个尽量选即可. n^3logn 标算:n^3 dp 高度排序,保证从前往后 ...

  6. 清北考前刷题day1早安

    立方数(cubic) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK定义了一个数叫“立方数”,若一个数可以被写作是一个正整数的3次方,则这个数就是立方数 ...

  7. 清北考前刷题day1下午好

    水题(water) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK出了道水题. 这个水题是这样的:有两副牌,每副牌都有n张. 对于第一副牌的每张牌长和宽 ...

  8. 清北考前刷题da7下午好

    三向城 /* 原图一定是一棵完全二叉树. 根节点是x,左节点是x*2,右节点是x*2+1 转化为二进制往左右走就很明显了. */ #include<iostream> #include&l ...

  9. 清北考前刷题day6下午好

    /* 贪心 负数一定不取 枚举最高位是1 且答案取为0的 位置, 更新答案. */ #include<iostream> #include<cstdio> #include&l ...

随机推荐

  1. 【03】Html书写规范

    [03]   Html书写规范   1.推荐使用html5的文档声明 <!DOCTYPE HTML> 2.必须申明文档的编码charset,且与文件本身编码保持一致,推荐使用UTF-8编码 ...

  2. FZU Problem 2132 LQX的作业 (数学题)

    http://acm.fzu.edu.cn/problem.php?pid=2132 N个数已经排成非递减顺序,那么每次可以取 前m->n个在x前面.取前m个在x前面的概率是 C(n,m)*x^ ...

  3. Network-POJ3694(最小公共祖先LCA+Tarjin)

    http://poj.org/problem?id=3694 这一题  为什么要找最小祖先呢 当两个节点连到一块的时候  找最小公共节点就相当于找强连通分支 再找最小公共节点的过程中直到找到  这个过 ...

  4. flask到底能登录多少用户?

    flask默认情况下是单进程的,所以每次只能处理一个请求: 当然可以多起几个进程或者线程,这样flask就可以处理多个请求: 认证后的用户,进行一次操作(一个GET操作.一次POST操作或者其他),会 ...

  5. Django学习系列之ORM-QuerySetAPI

    基本操作 # 增 models.Tb1.objects.create(c1='xx', c2='oo') #增加一条数据,可以接受字典类型数据 **kwargs obj = models.Tb1(c1 ...

  6. 数学之路-python计算实战(21)-机器视觉-拉普拉斯线性滤波

    拉普拉斯线性滤波,.边缘检測  . When ksize == 1 , the Laplacian is computed by filtering the image with the follow ...

  7. Nodejs 一个简单的后台实例

    http://blog.csdn.net/u014595019/article/details/50845726

  8. c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具

    c#实例化继承类,必须对被继承类的程序集做引用   0x00 问题 类型“Model.NewModel”在未被引用的程序集中定义.必须添加对程序集“Model, Version=1.0.0.0, Cu ...

  9. C#在Linux下获取文件夹信息(所在磁盘总大小,使用空间,已用空间,使用率)

    1.第一种使用shell命令实现: private DiskInfo LinuxGetFolderDiskInfo(string path) { DiskInfo disk = new DiskInf ...

  10. canvas.clipPath canvas.clipRect() 无效的原因

    今天发现有些机型不能做到像QQ 透明截图那样的功能,本来能够的.一看是部分机器所有都是灰色半透明遮挡住了,没中间的透明效果,. 并且我不是通过遮挡,我是採用 裁剪的方式,至于裁剪代码百度有相关知识,具 ...