托米的位运算 牛客练习赛23 C
生活随笔
收集整理的這篇文章主要介紹了
托米的位运算 牛客练习赛23 C
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:題目
1.賽時WA了6次,看題解才發現自己思路錯了。正確思路見注釋
//這道題第一開始想的是,先升序,轉換成二進制,找到__builtin__ffc()最大的那一個數 //“”“以為這個數一定取”“”,然后逐個按位與就好,如果結果小于這個數,那么不要,大于等于這個數,就要 //后來交后發現判題只過了%50的數據,WA //看題解后才明白,思路正好與我的相反,直接從最高位開始暴力,相同位置都為1的數直接emplace vector //然后[0,最高位)只要每一個位置,縱向對比,不全為0就好了,很明顯,我的思路中加引號的那一個點是錯的 #include<iostream> #include<cstdio> #include<vector> using namespace std; int main(void) {ios::sync_with_stdio(false);//freopen("E:\\input.txt","r",stdin);int n;cin>>n;vector<int> data(n);for(int i=0;i<n;i++)cin>>data[i];for(int i=31;i>=0;i--){//題目說只有2^31 ,所以從31位開始暴力就好了vector<int> choose;for(int j=0;j<n;j++)if((data[j]>>i)&1)choose.emplace_back(data[j]);//C++11中的特性,相當于push_back(),不過速度要比push_back()快int ok=1;for(int j=0;j<i;j++){//遍歷[0,最高位),縱向對比,只要發現一個0就好了int flag=1;for(auto& x:choose){//C++11中的foreach用法if(((x>>j)&1)==0){flag=0;break;}}if(flag){ok=0;break;}}if(ok){cout<<choose.size()<<endl;for(int i=0;i<choose.size();i++)cout<<choose[i]<<" \n"[i==choose.size()-1];//如果不是最后一個數,輸出空格,如果是最后一個數,輸出回車。??瓦€卡格式錯誤,要不不用這么麻煩的寫法return 0;}}return 0; }?
總結
以上是生活随笔為你收集整理的托米的位运算 牛客练习赛23 C的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 区分性训练
- 下一篇: 实现鼠标控制场景的视野及移动