日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads

發(fā)布時間:2025/3/20 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 題意
  • 輸入格式
  • 輸出格式
  • 樣例
    • Input
    • Output
  • 數(shù)據(jù)范圍
  • 時間限制
  • 思路
  • 代碼

題意

\(N\)個人,現(xiàn)在你要從中選出\(K\)個人出來,然后讓這\(K\)個人一起參加\(K\)場比賽。其中,每個人都要參加所有的比賽。

定義其中一場比賽的得分為這\(K\)個人的得分的最大值。然后定義這個隊(duì)的得分為\(K\)場比賽的得分的加和。

例如,\(K=3\)時,有一支3個人的隊(duì)伍,一共打3場比賽。第1個人在3場比賽中的得分分別為\((4, 5, 3)\),第2個人在3場比賽中的得分分別為 \((7, 3, 6)\), 第3個人在3場比賽中的得分分別為 \((3, 4, 5)\)。那么這個隊(duì)伍的總得分就是\(7+5+6=18\)

現(xiàn)在你要求出的是,總分最第\(C\)大的隊(duì)伍的得分是多少。定義兩個隊(duì)伍不同,當(dāng)且僅當(dāng)存在兩個兩個隊(duì)伍的人的編號不同。

輸入格式

第一行3個整數(shù)分別表示\(N,K,C\)
接下來N行,每行K個整數(shù),表示每個人在每場比賽中的得分。

輸出格式

一行,輸出得分第\(C\)大的隊(duì)伍的得分。

樣例

Input

5 4 4
7 0 4 9
3 0 8 4
1 1 3 7
5 1 3 4
4 2 2 9

Output

24

數(shù)據(jù)范圍

1.(13 points) 1 ≤ N ≤ 500, 1 ≤ K ≤ 2, 1 ≤ C ≤ 2 000.
2.(31 points) 1 ≤ N ≤ 40, 1 ≤ K ≤ 6, 1 ≤ C ≤ 2 000.
3.(24 points) 1 ≤ N ≤ 500, 1 ≤ K ≤ 6, 1 ≤ C ≤ 2 000, 每個人的分?jǐn)?shù)大小不超過10.
4.(32 points) 1 ≤ N ≤ 500, 1 ≤ K ≤ 6, 1 ≤ C ≤ 2 000.

時間限制

\(2\ sec / 30\ sec\)

思路

首先聲明這是自己的方法,沒有看官方題解...

首先求一個得分最大的隊(duì)伍出來,怎么求呢?
就是讓每一場比賽的得分都盡量大,也就是取所有人中這場比賽得分最大的那個人。然后這樣子選完之后可能沒有選齊K個人,那么剩余的位置就隨便找人來補(bǔ)齊就好了。

然后仿照所有的求第k大的題目的做法,把這個隊(duì)伍塞到一個大根堆(priority_queue)中去,每次都從隊(duì)首取出一個當(dāng)前的最大答案,然后用這個隊(duì)伍進(jìn)行拓展,塞入其它沒有出現(xiàn)過的其他隊(duì)伍。

如何拓展呢?
最暴力的想法是,每次都將這個隊(duì)伍中的一個人換成另外一個人,然后在確定了這支新的隊(duì)伍沒有出現(xiàn)過之后,就將這支隊(duì)伍也塞到優(yōu)先隊(duì)列中去。

如何判斷之前是否重復(fù)呢?我用的是Hash,然后把Hash值塞到一個set里面去,就可以簡單的判重了。

考慮一下時間復(fù)雜度:一共要取出C次,就是\(O(C)\),每次都要枚舉將哪個人替換掉,也就是\(O(K)\)。還要枚舉替換成哪個人,也就是\(O(N)\)。替換了之后,還要算出新的隊(duì)伍的得分是多少,也就是\(O(K^2)\)的。然后還有set和priority_queue的時間復(fù)雜度,設(shè)為\(Const\)。那么總的時間復(fù)雜度就是\(O(N*K^3*C*Const)\),大概有\(216,000,000+\),好像跑不過...

考慮剪枝。考慮替換一個人的時候,只在N個人當(dāng)中選出那些替換之后會使得答案變小或不變的那些人進(jìn)行判重,判斷沒有出現(xiàn)過之后再選取其中的最大值進(jìn)行擴(kuò)展。這樣子總共擴(kuò)展出來的節(jié)點(diǎn)數(shù)就有原來的\(C*K*N\)變?yōu)榱?span id="ozvdkddzhkzd" class="math inline">\(C*K\),優(yōu)先隊(duì)列和set部分的時間就變小了。然后枚舉的時候,也被剪掉了不少。這樣子就可以跑到0.3s~0.4s左右。

代碼

實(shí)現(xiàn)的有點(diǎn)丑,但是算法還是很簡單暴力的。

#include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define MAXN 500 #define MAXK 6 #define MAXC 2000 #define MO 10000007 using namespace std; typedef long long LL; struct state {int val;LL st;state(){};state(int _val,LL _st):val(_val),st(_st){}; }; bool operator < (const state &A,const state &B){return A.val<B.val;} priority_queue<state> que; struct node {LL x;node *nxt; }nd[MAXC*MAXN*MAXK+5]; node *ncnt=&nd[0],*Adj[MO+5]; int n,k,c,tmp[MAXK+1]; int scr[MAXN+5][MAXK+1]; LL Encode(int *seq) {LL ret=0;for(int i=1;i<=k;i++)ret=1LL*ret*n+(1LL*seq[i]-1);return ret; } void Decode(LL val,int *seq) {for(int i=k;i>=1;i--)seq[i]=val%n+1,val/=n; } int GetVal(int *seq) {int ret=0;for(int j=1;j<=k;j++){int mxval=0;for(int i=1;i<=k;i++)mxval=max(mxval,scr[seq[i]][j]);ret+=mxval;}return ret; } void Print(int *seq) {for(int i=1;i<=k;i++)printf("%d ",seq[i]);printf("\n"); } void Insert(LL x) {int id=x%MO;node *p=++ncnt;p->x=x;p->nxt=Adj[id];Adj[id]=p; } bool Find(LL x) {int id=x%MO;for(node *p=Adj[id];p!=NULL;p=p->nxt)if(p->x==x)return true;return false; } int Solve() {static int tmp1[MAXK+5],tmp2[MAXK+5];static bool sp[MAXN+5];state fro;for(int tmn=1;tmn<c;tmn++){fro=que.top();que.pop();Decode(fro.st,tmp1);for(int i=1;i<=k;i++)sp[tmp1[i]]=1;for(int i=1;i<=k;i++){LL mxst;int mxval=-1;for(int j=1;j<=n;j++)if(sp[j]==false){for(int p=1;p<=k;p++)tmp2[p]=tmp1[p];tmp2[i]=j;int val=GetVal(tmp2);if(val>fro.val) continue;if(val>mxval){sort(tmp2+1,tmp2+1+k);LL st=Encode(tmp2);if(Find(st))continue;mxval=val,mxst=st;}}if(mxval==-1)continue;Insert(mxst);Decode(mxst,tmp2);que.push(state(mxval,mxst));}for(int i=1;i<=k;i++)sp[tmp1[i]]=0;}return que.top().val; } int main() {freopen("olymp.in","r",stdin);freopen("olymp.out","w",stdout);scanf("%d %d %d",&n,&k,&c);for(int i=1;i<=n;i++)for(int j=1;j<=k;j++)scanf("%d",&scr[i][j]);for(int j=1;j<=k;j++){int mxpos=-1;for(int i=1;i<=n;i++)if(mxpos==-1||scr[mxpos][j]<scr[i][j])mxpos=i;tmp[j]=mxpos;}sort(tmp+1,tmp+1+k);int len=unique(tmp+1,tmp+1+k)-tmp-1;for(int i=len+1;i<=k;i++)for(int j=1;j<=n;j++){bool Find=false;for(int p=1;p<i&&Find==false;p++)if(tmp[p]==j)Find=true;if(Find==false){tmp[i]=j;break;}}sort(tmp+1,tmp+1+k);LL ret=Encode(tmp);Insert(ret);que.push(state(GetVal(tmp),ret));int ans=Solve();printf("%d\n",ans);return 0; } /* 5 4 4 7 0 4 9 3 0 8 4 1 1 3 7 5 1 3 4 4 2 2 9*/

轉(zhuǎn)載于:https://www.cnblogs.com/T-Y-P-E/p/11046377.html

總結(jié)

以上是生活随笔為你收集整理的[BOI2019][第K大问题][暴力剪枝]D2T1 Olympiads的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美性一区二区 | 草比视频在线观看 | 6080午夜伦理 | 黄黄的网站| 91理论片午午伦夜理片久久 | wwwxxx在线观看 | 波多野结衣一区二区在线 | 免费在线观看一区 | 久久久久中文 | 日韩一区欧美一区 | 91超碰免费在线 | 日韩欧美一卡二卡 | 亚洲蜜桃av一区二区 | 狠狠人妻久久久久久综合蜜桃 | 一级生活毛片 | 91欧美视频 | 久久亚洲精品无码va白人极品 | 裸体一区二区三区 | 亚洲成人网av | 911精品国产一区二区在线 | 日本精品免费视频 | av无码精品一区二区三区 | 337p日本欧洲亚洲鲁鲁 | 一区二区三区在线免费视频 | 日日天天干 | www在线看片 | 亚洲日本片| 久久亚洲第一 | 99久久久无码国产精品不卡 | 韩国无码av片在线观看网站 | 国产一区二区毛片 | 黄色成年人视频 | 欧美黑人一级 | www.久久伊人 | 亚洲成人另类 | 综合激情视频 | 91免费视频网址 | 在线高清av| 全部免费毛片在线播放 | av综合久久 | 精品久久一区 | 91视频播放器 | 久久精品国产亚洲AV黑人 | 国产黄色大片视频 | 97超级碰碰人妻中文字幕 | 午夜日韩欧美 | 国产精品久久久久久久久毛片 | 深夜在线 | 日韩免费在线视频 | 麻豆人妻少妇精品无码专区 | 北条麻妃一区二区三区四区五区 | 素人fc2av清纯18岁 | 激情欧美一区二区三区 | 人乳videos巨大吃奶 | 少妇流白浆 | 国产又粗又猛又黄又爽的视频 | 人人妻人人澡人人爽人人精品 | 欧美精品一二三四区 | 日本美女在线 | 国产网站入口 | 亚洲国产色图 | 女人裸体又黄 | 国产91看片 | 色撸撸在线 | 亚洲欧洲免费 | 亚洲福利午夜 | 成年人视频免费在线观看 | 超碰人人搞 | 99热只有| 国产视频三级 | 国精产品一区一区三区mba下载 | 亚洲av日韩精品久久久久久久 | 欧美大片在线播放 | 亚洲天堂av在线免费观看 | 人人射人人射 | 免费a在线观看 | 久久91亚洲精品中文字幕奶水 | 欧美黄频| 色噜噜狠狠一区二区三区牛牛影视 | 秋霞视频在线 | 日本私人影院 | 精品一区视频 | 日本精品入口免费视频 | 夜夜操国产 | 国产综合自拍 | 欧美日韩一区二区不卡 | 黄色香蕉网 | 国产夫妇交换聚会群4p | av这里只有精品 | 欧美一级在线免费观看 | 欧美寡妇性猛交 | 综合热久久 | 污视频网站在线播放 | 精品网站999 | 日韩久久综合 | 啪啪av | 97在线观看免费高清 | 欧美日韩高清一区二区三区 | 国产午夜精品无码一区二区 |