一些性质:h指数 逆序对 矩阵对角线的表示 切正方形 前缀和得区间取模(想不到就猜结论)
奶牛学术圈https://www.acwing.com/problem/content/3748/
h 指数等于使得研究员有至少 h 篇引用次数不少于 h 的论文的最大整数 h。
有l次机会提高每篇的引用次数+1
求h指数最多可以是多少:
h指数就是从大到小 下标的最右边位置
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,l;
const int N = 1e5+10;
int q[N];
int res;
bool check(int x){
int a=0,b=0;
for (int i = 1; i <= n; i ++ ){
if(q[i]>=x) a++;
else if( x-q[i]==1) b++;
}
b=min(l,b);
if(a+b>=x)
return true;
return false;
}
int main()
{
cin >> n>>l;
for (int i = 1; i <= n; i ++ ) cin >> q[i];
sort(q+1,q+1+n,greater<int>());
int l=1,r=n;
while ( l<r ){
int mid=(l+r+1)/2;
if(check(mid)) l=mid;
else r=mid-1;
}
cout << l;
return 0;
}
奶牛体操
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 25;
int f[N][N];
int a[N];
int main()
{
int n,k;
cin >> k>>n;
for (int i = 1; i <= k; i ++ ){
for (int i = 1; i <= n; i ++ ) cin >> a[i];
for (int i = 1; i <= n; i ++ ){
for (int j = i+1; j <=n; j ++ )
f[a[i]][a[j]]++;//邻接矩阵i j存每个第i个数在第j个数前面的次数
}
}
int res=0;
for (int i = 1; i <= n; i ++ ){
for (int j = 1; j <=n; j ++ ){
if(f[i][j]==k) res++;//如果出现恰好k次说明在前面恰好那么多次
}
}
cout << res;
return 0;
}
矩阵对角线表示:八皇后
u为纵轴 i为横轴
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 20;
char g[N][N];
int n;
bool a[N],dg[N],udg[N];
void dfs(int u){
if(u==n){
for (int i = 0; i < n; i ++ )
{for (int j = 0; j < n; j ++ )
cout <<g[i][j];
cout << endl;
}
cout << endl;
return ;
}
for (int i = 0; i < n; i ++ ){
if(!a[i]&&!dg[u+i]&&!udg[u-i+n])
{
a[i]=dg[u+i]=udg[u-i+n]=true;
g[u][i]='Q';
dfs( u+1 );
g[u][i]='.';
a[i]=dg[u+i]=udg[u-i+n]=false;
}
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ )
for (int j = 0; j < n; j ++ )
g[i][j]='.';
dfs( 0);
return 0;
}
分巧克力 https://www.acwing.com/problem/content/1229/
n个巧克力 要把它分成a长b宽的正方形 求最大值
向下取整
可以切出的个数 =[宽/边长]*[长/边长]
前缀和得区间取模
前缀和区间取模--获得一个区间的和%k==0;
变成一个求组合数的问题
这里需要注意 一个区间本来就能被k整除 所以他一个人就能成功
ans 是成对出现的次数 cnt[0] 是 0 单独出现的次数
比如取模后 1 1 0 0 1
1 1
1 1
1 1
0 0
0
0
区间一共六个。
就是之前找到的是两个 区间的 mod之后相同的值,但是对于 mod == 0区间 我可以不用找另外区间,我本身就是符合 mod k == 0 这个条件,循环里统计的时候没有考虑这个情况,所以之后要再加上