杭电多校联赛(六)补题

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.

题目大意:选择一段连续区间,且区间和是一个素数,给你一个必须包含的数字, 结果返回所得区间的长度.

本场唯一过的一道题…(太菜了),总的来说,题目中说让我们寻找区间和是一个素数, 那么我们必定以所给必须包含元素做讨论:

  1. 如果所给数字为非负数

假设给我们的数字为num,首先我们明确一点那就是, 三个及三个以上的连续正整数之和必定不是素数, 这个很容易想到. 因为 (num-1)+(num)+(num+1)==3*num 所以我们首先想到的是了答案长度为1 or 2这两种情况,所以也就是 判定 num,num + num + 1,num + num - 1这三者是否为素数. 这也是最简单的情况.
如果以上三种情况不可取,那么我们会想到利用0左边的区间来抵消右边的区间来达到左边的正整数个数不超过2, 也就是对于num如果不满足以上三种情况简单, 那么我们可以将左区间扩展到-num, 来使区间和归零, 然后重新重复对下一个元素num+1来判断上述简单的三种情况.

  1. 如果所给数字为正数

假定给定的数字为-num, 将数字右端加上2 * num来使区间归零,然后按照1中的情况继续来求解即可.

另外,关于素数的判断,我们可以用素数筛也可以使用快速判断素数模板.

#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, 需要构造一个数组c, 这样的数组可以被分割成m个区间后,每个区间的中位数为bi, 且数组是由1,2,3…n构成的,且唯一,你需要判断时候可以构造出这样的数组.

思路 :中位数可以将区间分成许多子区间,可以假设最大子区间找出最大的子区间长度, 然后如果剩余区间的长度之和小于其他的区间长度, 那么一定存在解,直接输出‘yes’

如果大于其他的区间长度, 那么就会多余maxL - sumL,其中maxL代表最初子区间的长度,sumL代表其他区间的长度总和, 那么我们求得小于最大区间最小值, 也就是最大长度块前面的块数cnt, 我们将最大区间里面的多余数字全部放在前面块的末尾, 这样前面的块依然满足中位数的条件, 所以对于这种情况我们直接判断 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;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容