首页 > 其他分享 >iwtgm-16

iwtgm-16

时间:2023-11-07 13:22:40浏览次数:35  
标签:tmp cnt 16 int 高度 iwtgm 钉住 now

题目链接

A.

层取,因为它的高度只有2e5,我把每个高度的方格个数记录下来
最后从高到低跑一遍,大于k的ans++
有几个点:
顺序无关紧要,所以先从小到大排个序
从右往左,若前一个与当前的高度相同就continue,直到高度不相同
有一个变量now,记录的是当前高度
把当前高度-1的方格个数就是n-i+1
因为我们是一层一层递减的,且是排好序的,所以当前和当前后面这个高度一定有方格
只要前一个与当前高度不一样,now就不断记录个数然后--
高度数组h[0]的高度是0,一定与其他高度不同
然后要注意的是在最后统计答案时
若tmp+当前高度的个数>k,那么ans++,tmp=当前高度的个数
若==k,tmp=0

ll n,k;
ll h[N];
ll cnt[N];
void solve()
{
    cin>>n>>k;
    ll now=-1,ma;
    ll mi=inf;
    for(int i=1;i<=n;i++){
        cin>>h[i];
        if(h[i]>now)now=h[i];
        if(h[i]<mi)mi=h[i];
    }
    ma=now-1;
    sort(h+1,h+1+n);
    bool f=false;
    for(int i=n;i>=1;i--){
        if(h[i-1]==now)continue;
        while(h[i-1]!=now) {
            cnt[now - 1] = n - i + 1;
            //cout<<"now-1="<<now-1<<' '<<"num="<<n-i+1<<endl;
            now--;
            if(now==mi){
                f=true;break;
            }
        }
        if(f==true)break;
    }
    ll tmp=0,ans=0;
    for(int i=ma;i>=mi;i--){
        if(tmp+cnt[i]<k)tmp+=cnt[i];
        else if(tmp+cnt[i]==k){
            ans++;tmp=0;
        }
        else{
            ans++;
            tmp=cnt[i];
        }
        if(i==mi&&tmp)ans++;
    }
    cout<<ans;
}

B.

设矩形两边分别为a,b
那么就是求4(a+b)^2/(ab)最小
因为(a+b)^2>=0,把括号展开、移项
得到a2+b2>=2ab,当ab时等号成立
可得当a
b的时候也就是正方形的时候是最小的
然后就是让a尽可能接近b,即b/a尽可能小(b>a)
对边长计数,>=4的就输出它
记录所有>=2的边长,看相邻两个谁的b/a最小就输出哪两条

提一嘴错误思路:
分子是平方级的,想着让a,b尽可能小整个分式就能小
这样不无道理但并不全对

#define int long long
ll cnt[N];
vector<ll>v;
void solve()
{
    memset(cnt,0,sizeof(cnt));v.clear();
    int n;cin>>n;
    int success=-1;
    for(int i=1,x;i<=n;i++){
        cin>>x;cnt[x]++;
        if(cnt[x]==2)v.push_back(x);
        if(cnt[x]==4)success=x;
    }
    if(success!=-1){
        for(int i=1;i<=4;i++){
            cout<<success<<' ';
        }
        cout<<endl;return ;
    }
    int ans1,ans2;
    long double mi=inf;
    long double tmp;
    sort(v.begin(),v.end());
    for(int i=1;i<v.size();i++){
        tmp=v[i]*1.0/v[i-1];
        if(tmp<mi){
            mi=tmp;
            ans1=v[i-1];ans2=v[i];
        }
    }
    for(int i=1;i<=2;i++){
        cout<<ans1<<' '<<ans2<<' ';
    }
    cout<<endl;
}

C.

这题自己想了挺多,有两个维度,一个是同种编号的数量,一个是最大读的信息数
并不好对一维排序然后处理另一维
首先这题是求期望,样例给的思路是把所有情况满足条件的人数求个总和再除以钉住的信息数
但这样显然数据量大且不好处理
于是打算根据期望的意义另开辟一条思路
举个例子,有10条信息供你选择,你最多读3条,那么你满足条件的期望就是3/10,跟总和/钉住信息数等价,至此简化了题意
于是我对于每个编号圈了一个集合,枚举钉住信息数量,(必选当前这条信息)我可以得到多大的期望
因为每个人最大阅读信息数量范围只有20,当我钉住信息数量大于20时,那么每条有效期望都是1/钉住信息数
差别只有每个编号集合元素的数量
把每个编号的答案放进答案数组里并按从大到小排序
得到答案:
选一条钉住,就是前一条
两条钉住,就是前两条
...
然后从21枚举到n,逐一比较答案

int n;
struct node{
    int cnt;
    vector<int>v;
};
map<int,node>mp;//编号,k集
int cnt[25];
vector<pair<long double,int>>ans[25];
bool cmp(pair<long double,int> x,pair<long double,int>y){
    return x.first>y.first;
}
int a1,a2;
vector<pair<int,int>>more;
bool cmp1(pair<int,int>x,pair<int,int>y){
    return x.first>y.first;
}
void solve()
{
    cin>>n;
    for(int i=0,id,k;i<n;i++){
        cin>>id>>k;
        mp[id].v.push_back(k);
        mp[id].cnt++;
    }
    for(auto tmp:mp){
        more.push_back({tmp.second.cnt,tmp.first});
        memset(cnt,0,sizeof(cnt));
        for(int i=0;i<tmp.second.v.size();i++){
            cnt[tmp.second.v[i]]++;
        }
        for(int i=1;i<=20;i++){
            long double tm=0;
            for(int j=1;j<=20;j++){
                if(j*1.0/i>1)tm+=1*cnt[j];
                else tm+=j*1.0/i*cnt[j];
            }
            ans[i].push_back({tm,tmp.first});
        }
    }
    for(int i=1;i<=20;i++){
        sort(ans[i].begin(),ans[i].end(),cmp);
    }
    long double tmp=-1;
    for(int i=1;i<=20;i++){
        long double tt=0;
        for(int j=0;j<i&&j<ans[i].size();j++){
            tt+=ans[i][j].first;
        }
        //cout<<"tt="<<tt<<endl;
        if(tt>tmp){
            tmp=tt;
            a1=i;
        }
    }
    sort(more.begin(),more.end(),cmp1);
    int sum=0;
    for(int i=0;i<more.size();i++){
        if(i<20){
            sum+=more[i].first;continue;
        }
        sum+=more[i].first;
        long double tt=sum*1.0/(i+1);
       // cout<<"a2tt="<<tt<<endl;
        if(tt>tmp){
            a2=i+1;tmp=tt;
        }
    }
    if(a2){
        cout<<a2<<endl;
        for(int i=0;i<a2;i++){
            cout<<more[i].second<<' ';
        }
    }
    else {
        int size=ans[a1].size();
        int a11=min(a1,size);
        cout<<a11<<endl;
        for(int i=0;i<ans[a1].size()&&i<a1;i++){
            cout<<ans[a1][i].second<<' ';
        }
    }
}

标签:tmp,cnt,16,int,高度,iwtgm,钉住,now
From: https://www.cnblogs.com/wwww-/p/17813940.html

相关文章

  • chapter12-chapter16
    目录chapter12:内中断1.内中断的产生2.中断处理程序3.中断向量表4.中断过程5.中断处理程序和iret指令单步中断chapter13:int指令chapter14:端口1.端口2.shl和shr指令chapter15:外中断1.可屏蔽中断2.不可屏蔽中断3.CPU及时处理外设输入的过程4.PC机键盘的处理过程chapter16:直接定址表1.......
  • http://localhost:xxxxx/sockjs-node/info?t=1699323049868
    http://localhost:xxxxx/sockjs-node/info?t=1699323049868 sockjs-node是一个JavaScript库,提供跨浏览器JavaScript的API,创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。解决办法: 配置devServer,然后重启项目1.在vue.config.js中找到devServer中加入 host:'l......
  • openGauss学习笔记-116 openGauss 数据库管理-设置数据库审计-审计概述
    openGauss学习笔记-116openGauss数据库管理-设置数据库审计-审计概述116.1背景信息数据库安全对数据库系统来说至关重要。openGauss将用户对数据库的所有操作写入审计日志。数据库安全管理员可以利用这些日志信息,重现导致数据库现状的一系列事件,找出非法操作的用户、时间和内......
  • 代码训练营第二十五天(Python)| 216.组合总和III 、17.电话号码的字母组合
    216.组合总和IIIclassSolution:defcombinationSum3(self,k:int,n:int)->List[List[int]]:res=[]self.tracebacking(n,k,1,0,[],res)returnresdeftracebacking(self,targetsum,k,start,now_sum,path,res):......
  • MTK联发科MT8766/MT8166安卓核心板性能参数对比
    MT8766核心板采用联发科四核2G主频芯片方案,国内4G全网通。12nm先进工艺,支持Android9.0系统。GPU采用超强IMGGE8300,主频600MHz。支持高速LPDDR4/X,主频高达1600MHz。支持EMMC5.1。标配WIFI802.11ac/abgn,BT5.0。支持主流音视频格式和图片的解码。接口丰富,单/双路LVDS......
  • [NOI2016] 区间
    [NOI2016]区间题目描述在数轴上有$n$个闭区间从$1$至$n$编号,第$i$个闭区间为$[l_i,r_i]$。现在要从中选出$m$个区间,使得这$m$个区间共同包含至少一个位置。换句话说,就是使得存在一个$x$,使得对于每一个被选中的区间$[l_i,r_i]$,都有$l_i\leqx\leqr_i$。对......
  • Nodejs的安装以及配置(node-v12.16.1-x64.msi)
    Nodejs的安装以及配置1、安装node-v12.16.1-x64.msi点击安装,注意以下步骤本文设置nodejs的安装的路径:D:\soft\nodejs  继续点击next,选中AddtoPATH,旁边的英文告诉我们会把环境变量给我们配置好 当然也可以只选择Node.jsruntime,根据自己需要选择安装 下面如......
  • iwtgm-15
    题目链接这个dp题还是想多说一点,感觉之前写的还是不够清晰和透彻先提一嘴,感觉这个dp不同于一般的dp,不是从1递推到n,个人理解更像是桶,后面会有很神奇的转移,真的太巧妙了先解决一些局部问题吧首先来想想重复的情况如:0,1,1这个例子中1是重复的,我们的dp转移状态是dp[i][0]+=dp[i][0......
  • iwtgm-14
    没时间了,只补了一个小题,自己尝试证明了下结论哈哈,还挺不错的华中D把线分成两种:一种是只影响一个正方形的,就是最外围的那一圈,是偶数条一种是影响两个正方形的(公共边),也是偶数条已知偶数位是必胜态后手只要跟着先手走,先手选最外围的走,后手就选最外围的走,先手选公共边走,后手就......
  • 大二快乐日记10.16
    2.配置多个<url-pattern>子元素从Servlet2.5开始,<servlet-mapping>元素可以包含多个<url-pattern>子元素,每个<url-pattern>代表一个虚拟路径的映射规则。因此,通过在一个<servlet-mapping>元素中配置多个<url-pattern>子元素,也可以实现Servlet的多重映射。以ser......