題意:
有n個小朋友競選班長,一號想當班長,每個人都必須選擇乙個人當班長,並且不可以選擇自己,並且每個人都有乙個權值ai,這個權值就是如果1想讓這個人改變主意選擇自己當班長就得給他ai個糖果,只有當1的票數是唯一最多的時候,1才能競選班長,問1競選班長的最小花費糖果數。
思路昨天練習賽的最後乙個題,今天才ac,這個題目我們可以用貪心的方法,記得當時自己看完也馬上感覺是貪心,可以因為選擇了錯誤的貪心方法和策略,導致寫了很長,而且越寫越蒙,最後寫的腦袋短路了,悲劇啊,說下正解,我們可以列舉1號競選時的票數,對於每一次列舉,如果當前有人的票數比1號的x多,那麼就把他減少到x-1(肯定是挑選費用最小的),然後把當前的票數加到1身上,最後如果1號的票數大於當前的列舉票數,列舉失敗,如果等於,那麼就更新最優值,如果小於,就在剩下的沒有選則1的裡面挑選幾個最小的補上去,這樣就行了,說到這,可能有人去會想,1不是也要投一票嗎,怎麼沒考慮,其實根本不用管1這票投給了誰,因為只有出現這樣的狀態這一票才會有影響x x-1 x-1 x-1 x-1.....但是這個狀態是不存在的,想一下,這個題目每個人最多投一票,如果1的票數為x,那麼那個狀態的總票數就是 x + (x - 1) * (n - 1) + 1,其實x是大於等於2的(這個地方自己想,很好想),那麼就會得到 2 + (2 - 1) * (n - 1)+ 1 = n + 2,而每個人都一票,總票數是n,所以矛盾,所以不存在那種狀態,所以不用考慮1的那票投給了誰。
#include
#include
#include
#define n 120
using namespace std;
typedef struct
star;
typedef struct
node;
star e[n];
node node[n];
int list[n] ,tot;
int now[n] ,mark[n] ,mark[n];
int cost[n];
void add(int a ,int b)
bool camp(node a ,node b)
int main ()
for(i = 2 ;i <= n ;i ++)
scanf("%d" ,&cost[i]);
int star = 1;
if(star < now[1]) star = now[1];
int min = 1000000000;
for(i = star ;i <= n ;i ++)
sort(node + 1 ,node + id + 1 ,camp);
for(int k = 1 ;k <= now[j] - i + 1 ;k ++)
}if(ss + now[1] == i)
else if(ss + now[1] > i)
continue;
int id = 0;
int tmp[n];
for(j = 2 ;j <= n ;j ++)
for(int k = list[j] ;k ;k = e[k].next)
if(!mark[e[k].to])tmp[++id] = cost[e[k].to];
sort(tmp + 1 ,tmp + id + 1);
for(j = 1 ;j <= i - (ss + now[1]) ;j ++)
sum += tmp[j];
if(min > sum) min = sum;
}printf("%d\n" ,min);
}return 0;
}
kosaraju 班長競選
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學,你能幫幫他嗎?本題有多組資料。第一...
C 班長競選
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適,給出m個意見,找到得票最多的人 dfs求出每個點所在的連通分量,然後縮點,並記錄縮點之後每個點的入度 要將圖反向 遍歷得到每個...
C 班長競選
大學班級選班長,n 個同學均可以發表意見 若意見為 a b 則表示 a 認為 b 合適,意見具有傳遞性,即 a 認為 b 合適,b 認為 c 合適,則 a 也認為 c 合適 勤勞的 tt 收集了m條意見,想要知道最高票數,並給出乙份候選人名單,即所有得票最多的同學。從圖中找出所有強連通分量進行縮點,...