Game 圍圈比賽

2021-07-27 03:49:07 字數 1889 閱讀 8560

我們在生命的路上常常絕望 大概是因為彎路走了太多

腳上的泡被磨起又磨破

像我們所有的幻想與夢 起起落落。

所以說 我這道題考場上面和題解想得一模一樣啊啊啊啊啊啊啊啊啊啊!!!!!!

但是就是打複雜了啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!!!!!!

為什麼我每次一看到環就感覺自己被耍了啊啊啊啊啊啊!!!!!!

自己的寫法大概是有乙個head tail記錄環的首尾這樣比較的時候就可以方便跳 然後我還加了乙個-1的處理保證被合併了的不再被處理

考場上改了蠻久不過最後還是爆零啦

標程給出的方法是用了乙個l陣列和乙個r陣列

這個數被合併了就把它的r賦給左邊的r

就相當於通過lr的操作把它擠掉

好無奈啊這麼簡單又機智的辦法我居然沒想到

因為lr陣列那邊處理起來還是有點問題所以標解是手打快排了的

這是標解

#include

#include

#include

#include

#include

#include

#include

#define inf 2147483647

#define fre(z) freopen(z".in","r",stdin),freopen(z".out","w",stdout)

#define my long long

#define d "%lld"

using namespace std;

const my n=100000;

my getint();

my n;

my a[n+1];

my w[n+1];

my l[n+1],r[n+1];

my ans;

void qsort(my,my);

//////

//////在乙個環中每次選擇兩個相鄰元素,分數加上兩個元素之差,然後把小的元素移除,問分數之和的最小值是多少

//////

//////貪心

//證明:

//對於當前環中最小值k以及k的相鄰兩個元素k_l,k_r

//把他與相鄰數操作後一定是自己移除

//然後每次合併後留下的是最大值

//所以如果先合併k_l及k_l左邊的元素或k_r及k_r右邊的元素,那麼合併後k相鄰兩個元素的值》=k_l,k_r

//所以首先合併k_l或k_r肯定更優

//然後肯定要合併min(k_l,k_r)

//然後直接刪除k即可

int main()

my getint()

void qsort(my l,my r)

}if (iif (l然而作為乙個徹頭徹尾stl黨很不服氣

於是強行一波

#include

#include

#include

#include

#include

#define n 100030

#define ll long long

using

namespace

std;

struct hh

a[n];

ll ans=0,n;

ll b[n];

bool cmp(hh x,hh y)

a[1].l=n,a[n].r=1;

sort(a+1,a+n+1,cmp);

for (int i=1;i<=n;++i) b[a[i].id]=i;

for (int i=1;icout

0;}

那麼這個悲慘的故事告訴我們處理問題的時候盡量簡化

因為想多了要處理的細節多了反而瞬間**

還不如把事情最簡化一下

N圍圈數數出圈

問題描述 有n個人圍城一圈,並從1到n編號,從第m個人開始報數,報到k的人出圈,下乙個人繼續從1開始報數,再報到k的人出圈,直到最後只剩下乙個人。問最後剩下的這個人是幾號。分析 用陣列來儲存每個人的編號,a 0 1,a 1 2,a n 1 n。定義出圈人數為outcircle,每齣圈乙個人,outc...

1334 例2 3 圍圈報數

時間限制 1000 ms 記憶體限制 65536 kb 提交數 5807 通過數 3799 題目描述 有 個人依次圍成一圈,從第 個人開始報數,數到第 個人出列,然後從出列的下乙個人開始報數,數到第 個人又出列,如此反覆到所有的人全部出列為止。設 個人的編號分別為1,2,n,列印出列的順序。輸入 n...

Python小遊戲 圍圈報數淘汰

n個人玩遊戲,從第乙個人開始按照1 2 3報數,報到3的人被淘汰,最終剩下的2人為天選之子 取得勝利!小遊戲 1 先確定玩遊戲的總人數 num n int input 請輸入總人數 2 建立總人數的列表 for i in range n 1 print 輸出列表元素 num 檢查驗證列表元素 3 定...