我們在生命的路上常常絕望 大概是因為彎路走了太多
腳上的泡被磨起又磨破
像我們所有的幻想與夢 起起落落。
所以說 我這道題考場上面和題解想得一模一樣啊啊啊啊啊啊啊啊啊啊!!!!!!
但是就是打複雜了啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!!!!!!
為什麼我每次一看到環就感覺自己被耍了啊啊啊啊啊啊!!!!!!
自己的寫法大概是有乙個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 定...