杭電多校聯(lián)賽(六)補(bǔ)題

1001. Prime Minister

Mr. Hacker's Department of Administrative Affairs (DAA) has infinite civil servants. Every integer is used as an id number by exactly one civil servant. Mr. Hacker is keen on reducing overmanning in civil service, so he will only keep people with consecutive id numbers in [l,r] and dismiss others.

However, permanent secretary Sir Humphrey's id number is x and he cannot be kicked out so there must be l≤x≤r. Mr. Hacker wants to be Prime Minister so he demands that the sum of people's id number ∑ri=li must be a prime number.

You, Bernard, need to make the reduction plan which meets the demands of both bosses. Otherwise, Mr. Hacker or Sir Humphrey will fire you.

Mr. Hacker would be happy to keep as few people as possible. Please calculate the minimum number of people left to meet their requirements.

A prime number p is an integer greater than 1 that has no positive integer divisors other than 1 and p.

題目大意:選擇一段連續(xù)區(qū)間,且區(qū)間和是一個素數(shù),給你一個必須包含的數(shù)字, 結(jié)果返回所得區(qū)間的長度.

本場唯一過的一道題…(太菜了),總的來說,題目中說讓我們尋找區(qū)間和是一個素數(shù), 那么我們必定以所給必須包含元素做討論:

  1. 如果所給數(shù)字為非負(fù)數(shù)

假設(shè)給我們的數(shù)字為num,首先我們明確一點那就是, 三個及三個以上的連續(xù)正整數(shù)之和必定不是素數(shù), 這個很容易想到. 因為 (num-1)+(num)+(num+1)==3*num 所以我們首先想到的是了答案長度為1 or 2這兩種情況,所以也就是 判定 num,num + num + 1,num + num - 1這三者是否為素數(shù). 這也是最簡單的情況.
如果以上三種情況不可取,那么我們會想到利用0左邊的區(qū)間來抵消右邊的區(qū)間來達(dá)到左邊的正整數(shù)個數(shù)不超過2, 也就是對于num如果不滿足以上三種情況簡單, 那么我們可以將左區(qū)間擴(kuò)展到-num, 來使區(qū)間和歸零, 然后重新重復(fù)對下一個元素num+1來判斷上述簡單的三種情況.

  1. 如果所給數(shù)字為正數(shù)

假定給定的數(shù)字為-num, 將數(shù)字右端加上2 * num來使區(qū)間歸零,然后按照1中的情況繼續(xù)來求解即可.

另外,關(guān)于素數(shù)的判斷,我們可以用素數(shù)篩也可以使用快速判斷素數(shù)模板.

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#define maxn (2 * 10000005)
#define mem memset
using namespace std;
int prime[maxn] = {0};
int visit[maxn] = {0};
void Prime() {
    for (int i = 2; i <= maxn; i++) {
        if (!visit[i]) {
            prime[++prime[0]] = i;
        }
        for (int j = 1; j <= prime[0] && i * prime[j] <= maxn; j++) {
            visit[i * prime[j]] = 1;
            if (i % prime[j] == 0) {
                break;
            }
        }
    }
}
int main()
{
    int t;
    bool isfu = false;
    long long res= 1;
    scanf("%d", &t);
    Prime();
    while (t--)
    {
        int n;
        int cur;
        res = 1;
        isfu = false;
        scanf("%d", &n);
        if (n == 0) {printf("3\n"); continue;}
        else if(n==1){printf("2\n"); continue;}
        else if(n < 0){
            n = -n;
            res = 2 * n + 1;
            n = n+1;
            isfu = true;
            res++;
        }
        if(visit[n] == 0) {cout << res << endl; continue;}
        else if( !isfu && (visit[n+n+1] ==0 || visit[n+n-1] == 0)) {cout << 2 << endl; continue;}
        else if(isfu && visit[n+n+1] == 0) {cout << res + 1 << endl; continue;}
        else{
            if(!isfu) res += 2 * n;
            else  res += 1;
            cur = n + 1;
            while(true){
                if(visit[cur] == 0){
                    res += 1;
                    break;
                }else if(visit[cur + cur + 1] == 0){
                    res += 2;
                    break;
                }else{
                    res += 2;
                    cur = cur + 1;
                }
            }
        }
        cout << res << endl;
    }
    return 0;
}

1004. Median

Mr. docriz has n different integers 1,2,?,n. He wants to divide these numbers into m disjoint sets so that the median of the j-th set is bj. Please help him determine whether it is possible.

Note: For a set of size k, sort the elements in it as c1,c2,?,ck, the median of this set is defined as c?(k+1)/2?.

題意,給你n,m 并且給出m個bi, 需要構(gòu)造一個數(shù)組c, 這樣的數(shù)組可以被分割成m個區(qū)間后,每個區(qū)間的中位數(shù)為bi, 且數(shù)組是由1,2,3…n構(gòu)成的,且唯一,你需要判斷時候可以構(gòu)造出這樣的數(shù)組.

思路 :中位數(shù)可以將區(qū)間分成許多子區(qū)間,可以假設(shè)最大子區(qū)間找出最大的子區(qū)間長度, 然后如果剩余區(qū)間的長度之和小于其他的區(qū)間長度, 那么一定存在解,直接輸出‘yes’

如果大于其他的區(qū)間長度, 那么就會多余maxL - sumL,其中maxL代表最初子區(qū)間的長度,sumL代表其他區(qū)間的長度總和, 那么我們求得小于最大區(qū)間最小值, 也就是最大長度塊前面的塊數(shù)cnt, 我們將最大區(qū)間里面的多余數(shù)字全部放在前面塊的末尾, 這樣前面的塊依然滿足中位數(shù)的條件, 所以對于這種情況我們直接判斷 maxL-sumLcnt的大小就可以了.

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#define maxn (2 * 10000005)
#define mem memset
using namespace std;
vector<vector<int> > v;
int a[N];
int st[N];

int cnt;
void solve(){
    int n,m;
    cin >> n >> m;
    v.resize(m + 2);
    for(int i = 1;i <= cnt;i ++) v[i].clear();
    cnt = 1;
    for(int i = 1;i <= n;i ++) st[i] = 0;
    
    for(int i = 1;i <= m;i ++) {
        cin >> a[i];
        st[a[i]] = 1;
    }
    for(int i = 1;i <= n;i ++) {
        if(!st[i]) {
            v[cnt].push_back(i);
        }else if(v[cnt].size()){
            cnt ++;
        }
    }
    int maxn = 0;
    int sum = 0;
    int id = 0;
    for(int i = 1;i <= cnt;i ++) {
        int k = v[i].size();
        if(maxn < k) {
            id = i;
            maxn = k;
        }
        sum += k;
    }
    sum -= maxn;
    if(n == m) {
        cout << "YES" << endl;
        return;
    }
    if(maxn < sum) {
        cout << "YES" << endl;
        return;
    }
    maxn -= sum;
    int res = 0;
    for(int i = 1;i <= m;i ++) {
        if(a[i] < v[id][0]) res ++;
    }
    if(res >= maxn) {
        cout << "YES" << endl;
    }else {
        cout << "NO" << endl;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市宣增,隨后出現(xiàn)的幾起案子挡毅,更是在濱河造成了極大的恐慌氨鹏,老刑警劉巖搀罢,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艘绍,死亡現(xiàn)場離奇詭異蚊荣,居然都是意外死亡初狰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門互例,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奢入,“玉大人,你說我怎么就攤上這事媳叨⌒裙猓” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵糊秆,是天一觀的道長武福。 經(jīng)常有香客問我,道長痘番,這世上最難降的妖魔是什么捉片? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮汞舱,結(jié)果婚禮上伍纫,老公的妹妹穿的比我還像新娘。我一直安慰自己昂芜,他們只是感情好莹规,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著泌神,像睡著了一般良漱。 火紅的嫁衣襯著肌膚如雪舞虱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天债热,我揣著相機(jī)與錄音砾嫉,去河邊找鬼。 笑死窒篱,一個胖子當(dāng)著我的面吹牛焕刮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播墙杯,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼配并,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了高镐?” 一聲冷哼從身側(cè)響起溉旋,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嫉髓,沒想到半個月后观腊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡算行,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年梧油,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片州邢。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡儡陨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出量淌,到底是詐尸還是另有隱情骗村,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布呀枢,位于F島的核電站胚股,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裙秋。R本人自食惡果不足惜信轿,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望残吩。 院中可真熱鬧,春花似錦倘核、人聲如沸泣侮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽活尊。三九已至隶校,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛹锰,已是汗流浹背深胳。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留铜犬,地道東北人舞终。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像癣猾,于是被迫代替她去往敵國和親敛劝。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容