常用技巧合集

1.尺取法

POJ 3061

#include <iostream>
#include <algorithm>
#include<cstring>
#define Max_N 50010
using namespace std;

int n, S;
int a[Max_N];
int ans[Max_N];
int ansNum = 0;

void solve() {
    if (S == 0) {
        ans[ansNum++] = 1;
        return;
    }
    int res = n + 1;
    int s = 0, t = 0, sum = 0;
    for (;;) {
        while (t < n&&sum < S)
        {
            sum += a[t++];
        }
        if (sum < S)
            break;
        res = min(res, t-s);
        sum -= a[s++];
    }
    if (res > n)
        res = 0;
    ans[ansNum++] = res;
}

int main()
{
    int cases;
    cin >> cases;
    while (cases>0)
    {
        cases--;
        cin>> n >> S;
        memset(a, 0, n);
        for (int i = 0; i < n; ++i) {
            cin >> a[i];
        }
        solve();
    }
    for (int i = 0; i < ansNum; i++) {
        cout << ans[i] << endl;
    }
    return 0;
}

POJ3320

#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#define Max_P 50000
using namespace std;

int P;
int a[Max_P];

void solve() {
    //set儲存全部的知識點
    set<int> all;
    for (int i = 0; i < P; ++i) {
        all.insert(a[i]);
    }
    int n = all.size();
    //以下為尺取法
    int s = 0, t = 0, num = 0;
    map<int, int> count;
    int res = P;
    for (;;) {
        while (t < P&&num < n) {
            if (count[a[t++]]++ == 0) {
                num++;//出現(xiàn)新的知識點
            }
        }
        if (num < n)
            break;
        res = min(res, t - s);
        if (--count[a[s++]] == 0) {
            //出現(xiàn)新的知識點
            num--;
        }
    }
    cout << res << endl;
}

int main()
{
    cin >> P;
    for (int i = 0; i < P; ++i) {
        cin >> a[i];
    }
    solve();
    return 0;
}

POJ 2739

#include "stdafx.h"
#pragma warning(disable:4996)
#include <iostream>
#include <cstdio>
#include <vector>
#define Max_N 100000
using namespace std;
int n;
int ans[Max_N];
int ansNum = 0;
int prime[Max_N];
bool is_Prime[Max_N];

void calculate_primes() {
    int p = 0;
    for (int i = 2; i < 10000; ++i) {
        is_Prime[i] = true;
    }
    is_Prime[0] = is_Prime[1] = false;
    for (int i = 2; i <= 10000; ++i) {
        if (is_Prime[i])
        {
            prime[p++] = i;
            for (int k = i * 2; k <= 10000; k += i) {
                is_Prime[k] = false;
            }
        }
    }
}

void solve() {
    int number = 0;
    int s = 0, t = 0, sum = 0;
    int end = 0;
    for (; n >= prime[end]; end++) {}
    for (int i = 0; i < end; i++) {
    while (sum < n&&t < end) {
            sum += prime[t++];
        }
        if (sum < n) {
            break;
        }
        while (sum > n&&s < t) {
            sum -= prime[s++];
        }
        if (sum == n) {
            number++;
            sum -= prime[s++];
        }
    }
    ans[ansNum++] = number;
}

int main()
{
    calculate_primes();
    while (scanf("%d",&n))
    {
        if (n == 0) {
            break;
        }
        solve();
    }
    for (int i = 0; i < ansNum; i++)
    {
        cout << ans[i] << endl;
    }
    return 0;
}

2.反轉問題

POJ 3276

#include <iostream>
#include <cstring>
#include <cstdio>
#define MAX_N 5050
using namespace std;

int N;
string Flip;
int dir[MAX_N];//牛的方向讯壶,0為正向,1為反向
int f[MAX_N];//區(qū)間[i,i+k-1]是否進行反轉


//固定K茄厘,求對應最小操作數(shù)
//無解的話返回-1
int calc(int K) {
    memset(f, 0, sizeof(f));
    int res = 0;//操作數(shù)
    int sum = 0;//在這頭牛上操作數(shù)的和,若為奇數(shù)夺饲,則此牛的方向與初始方向相反
    for (int i = 0; i + K <= N; ++i) {
        //計算區(qū)間i,i+K-1
        if ((dir[i] + sum) % 2 != 0) {
            res++;
            //即前端的牛面朝后方
            f[i] = 1;//進行一次反轉
        }
        sum += f[i];
        if (i - K + 1 >= 0) {
            sum -= f[i - K + 1];
        }
    }
    //檢查后面的是否有向后的情況,如果有味榛,則無解户魏,返回-1
    for (int i = N - K + 1; i < N; ++i) {
        if ((dir[i] + sum) % 2 != 0) {
            return -1;
        }
        if (i - K + 1 >= 0) {
            sum -= f[i - K + 1];
        }
    }
    return res;
}

void solve() {
    int K = 1, M = N;
    for (int k = 1; k <= N; k++) {
        int m = calc(k);
        if (m >= 0 && M > m) {
            M = m;
            K = k;
        }
    }
    cout << K << " " << M << endl;
}

int main()
{
    char input;
    cin >> N;
    for (int i = 0; i < N; ++i) {
        cin >> input;
        if (input == 'F')
            dir[i] = 0;
        else
            dir[i] = 1;
    }
    solve();
    return 0;
}

集合的整數(shù)表示
空集--0
只有第i個元素的集合{i}--1<<i
含有全部n個元素的集合{0蟆沫,1澳迫,.....葛躏,n-1}--(1<<n)-1
判斷第i個元素是否屬于集合S--if(S>>i&1)
向集合中加入第i個元素--S|1<<i
從集合中去除第i個元素--S&~(1<<i)
集合S和T的并集--S|T
集合S和T的交集--S&T


3.相遇碰撞問題

POJ 3684

#include<iostream>
#include "math.h"
#include <algorithm>
#include <iomanip>
#include <string.h>
#define MAX_N 200
using namespace std; 


const double g = 10.0;//重力加速度
int N, H, R, T;
double y[MAX_N];

double calc(int T) {
    if (T < 0)
        return H;
    double t = sqrt(2 * H / g);
    int k = (int)(T / t);
    if (k % 2 == 0) {
        double d = T - k * t;
        return H - g * d*d / 2;
    }
    else {
        double d = k * t + t - T;
        return H - g * d*d / 2;
    }
}

void solve() {
    memset(y, 0, sizeof(y));
    for (int i = 0; i < N; ++i) {
        y[i] = calc(T - i);
    }
    sort(y, y + N);
    for (int i = 0; i < N; ++i) {
        cout <<fixed<< setprecision(2) << (y[i] + 2 * R*i / 100.0) << " ";
    }
    cout << endl;
}

int main()
{
    int num;
    cin >> num;
    for (int i = 0; i < num; i++) {
        cin >> N >> H >> R >> T;
        solve();
    }
    return 0;
}

類似的如螞蟻相遇澈段,由于相遇前速度相同,相遇后兩者速度不變舰攒,方向相反败富,可以看作沒有碰撞,兩個球可以看作相互穿過摩窃。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末兽叮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子猾愿,更是在濱河造成了極大的恐慌鹦聪,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒂秘,死亡現(xiàn)場離奇詭異泽本,居然都是意外死亡,警方通過查閱死者的電腦和手機姻僧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門规丽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撇贺,你說我怎么就攤上這事赌莺。” “怎么了松嘶?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵艘狭,是天一觀的道長。 經(jīng)常有香客問我翠订,道長缓升,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任蕴轨,我火速辦了婚禮,結果婚禮上骇吭,老公的妹妹穿的比我還像新娘橙弱。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布棘脐。 她就那樣靜靜地躺著斜筐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛀缝。 梳的紋絲不亂的頭發(fā)上顷链,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音屈梁,去河邊找鬼嗤练。 笑死,一個胖子當著我的面吹牛在讶,可吹牛的內容都是我干的煞抬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼构哺,長吁一口氣:“原來是場噩夢啊……” “哼革答!你這毒婦竟也來了?” 一聲冷哼從身側響起曙强,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤残拐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后碟嘴,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溪食,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年臀防,在試婚紗的時候發(fā)現(xiàn)自己被綠了眠菇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡袱衷,死狀恐怖捎废,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情致燥,我是刑警寧澤登疗,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站嫌蚤,受9級特大地震影響辐益,放射性物質發(fā)生泄漏。R本人自食惡果不足惜脱吱,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一智政、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧箱蝠,春花似錦续捂、人聲如沸垦垂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽劫拗。三九已至,卻和暖如春矾克,著一層夾襖步出監(jiān)牢的瞬間页慷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工胁附, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留酒繁,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓汉嗽,卻偏偏與公主長得像欲逃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饼暑,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內容

  • 第一章 針挑療法 簡易速效的針挑療法 針挑療法也稱挑治療法稳析、針刺療法或挑病筋療法,是用特制針或縫衣針在人體的腧穴弓叛、...
    de7c69bfb64b閱讀 7,237評論 2 7
  • 8月26日彰居,我抱著打半天醬油的心態(tài)來到了龍兄的演講私房課,沒想到聽了上半場撰筷,我就開始熱血沸騰了陈惰,準備從旁聽者變成參...
    Aileen美鈺玉器閱讀 525評論 0 2
  • 一個做高端商務雜志希必地APP的許之一;一個做阿蛟物流的張曉蛟毕籽;一個做網(wǎng)絡代購的高挑美女艾瑪抬闯;一個做網(wǎng)絡直播的大胸...
    張永彬敏捷管理閱讀 521評論 0 3
  • 小葉眨著她那大大的眼睛沖我一笑,她一手端著托盤一手拿著抹布关筒,同時對著我說溶握,你就是新來的?還沒等我點頭蒸播,一位顧客已經(jīng)...
    皇后駕到閱讀 284評論 0 0
  • 姓名:韓文祥 單位:上海晉名實業(yè)有限公司 六項精進361期【日精進打卡第112天】 【知~學習】 背誦《六項精進》...
    祥子oboz閱讀 66評論 0 0