加载中...

一些性质: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 这个条件,循环里统计的时候没有考虑这个情况,所以之后要再加上


posted @ 2022-03-20 10:49  liang302  阅读(45)  评论(0编辑  收藏  举报