20170910校内训练

CCT

最近学校又发了n本五三题霸,BBS看到后十分高兴。但是,当他把五三拿到手后才发现,他已经刷过这些书了!他又认真地看了一会儿,发现新发的这些五三是2017版的,而他刷的是2016版的。现在他想找出所有他没有刷过的题来刷。每本五三都有m道题,并且它的特征(即它和去年版本的五三的差距)可以用一个m位二进制数来代表,二进制位上的1代表该题不同,0代表该题相同。比如4(100)就代表题目3和去年的有不同、5(101)就代表题目1和题目3和去年的有不同。而BBS热衷于给自己找麻烦,他要选择连续一段的几本五三一起刷,并且要求,所有选择的五三的特征中的所有m位中每一位出现1的次数都相同。他又想去刷最多的书,请你告诉他,他最多能刷多少本书?

输入格式:

第一行为两个整数 n、m,接下来的n行为 n 个整数,表示每本五三的特征。

输出格式:

一个整数,表示BBS最多能刷几本书。


样例输入


样例输出


7 3

7

6

7

2

1

4

2


4

样例解释:

这7本五三的特征分别为111,110,111,010,001,100,010。选择第3本至第6本五三,这些五三的特征中每一位都出现了2次1。当然,选择第4本到第6本也是可以的,这些五三的特征中每一位都出现了1次1。只是这样子BBS刷的书的数量就少了,他就会不高兴。

数据范围:

对于 100%的数据:1<=n<=100000,1<=m<=30。

不会,会了再说

MHM

LGL今天一共要上n节课,这n+1节课由0标号至n。由于过度劳累,除了第0节课和第n节课,LGL还打算睡上m节课,所以他做了一个睡觉计划表。通过小道消息,LGL得知WQ今天会在学校中检查,所以他想少睡k节课。但是由于某些原因,他又想使相邻的两节睡觉的课之间上的课数量的最小值最大。由于他很困,所以他请你来帮他计算这个值。

输入格式:

第一行为三个整数 n、m、k,接下来的m行为m个整数ai,表示睡觉计划表中LGL想要睡觉的课。

输出格式:

一个整数,表示题目所求的值。


样例输入


样例输出


25 5 2

14

11

17

2

21


3

样例解释:

选择第2节和第14节不睡觉,这样子相邻的两节睡觉的课之间上的课数量的最小值为3,即第17节和第21节之间和第21节到第25节之间。没有答案更大的删除方案。

数据范围:

对于100%的数据:1<=n<=109,0<=k<=m<=50000,0<ai<n。

跳石头,二分答案+check

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,k,a[50010];
bool check(int x)
{
    int y=0,z=k;
    for(int i=1;i<=m+1;i++)
    {
        if(a[i]-a[y]-1<x)z--;
        else y=i;
    }
    if(z>=0)return 1;
    return 0;
}
int main()
{
    //freopen("mhm.in","r",stdin);freopen("mhm.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++)scanf("%d",&a[i]);
    a[0]=0;a[m+1]=n;sort(a,a+m+2);
    int l=0,r=n+1;
    while(l<r)
    {
        int mid=(l+r)/2;
        if(check(mid))l=mid+1;
        else r=mid;
    }
    printf("%d",l-1);
    return 0;
}

AAFA

YYH有n道题要做。每一道题都有一个截止日期t,只要在该日期之前做完,他的父亲LRB就会奖励他w元钱。令人惊讶的是,每一道题他都只需要1秒来做。请问他最多能从父亲那里拿到多少钱?

输入格式:

第一行为一个整数 n,接下来的n行每一行都有两个数ti和wi,分别表示第i题的截止日期和奖励。

输出格式:

一个整数,表示YYH的最大获利。


样例输入


样例输出


3

2 10

1 5

1 7


17

样例解释:

第1秒做第3道题,第2秒做第1道题。

数据范围:

对于 100%的数据:1<=n、ti 、wi <=100000。

从后往前遍历时间轴,如果该秒有题,那么把该秒的奖励加入大根堆,然后对于每一秒,取出最大的值表示做这道题

因为对于某个时间,在这个时间以前都是可以做这道题的,所以很明显,对于每一秒,取最大值即可

#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<int> q;
int n;long long ans=0ll;
struct xxx{
    int t,w;
}f[100100];
bool cmp(xxx a,xxx b){return a.t>b.t;}
int main()
{
//    freopen("aafa.in","r",stdin);freopen("aafa.out","w",stdout);
    scanf("%d",&n);int y=1;
    for(int i=1;i<=n;i++)scanf("%d%d",&f[i].t,&f[i].w);
    sort(f+1,f+n+1,cmp);
    for(int i=100000;i>=1;i--)
    {
        while(i==f[y].t){q.push(f[y].w);y++;}
        if(!q.empty()){ans+=(long long)q.top();q.pop();}
    }
    cout<<ans;
    return 0;
}

ZZI

YYH拿到了父亲给的钱欣喜若狂,把这些钱拿来造了n栋房子。现在他要给这些房子通电。他有两种方法:第一种是在房间里搭核电发电机发电,对于不同的房子,他需要花不同的代价Vi;,第二种是将有电的房子i的电通过电线通到没电的房子j中,这样子他需要花的代价为aij。他现在请你帮他算出他最少要花多少钱才能让所有的房子通上电。

输入格式:

第一行为一个整数 n。接下来的n行为 n 个整数vi,再接下来的n行每行n个数,第i行第j列的数表示aij

输出格式:

一个整数,表示最小代价。


样例输入


样例输出


4

5

4

4

3

0 2 2 2

2 0 3 3

2 3 0 4

2 3 4 0


9

样例解释:

在第4栋房子造核电发电机,再将其他三栋房子通过电线连向它。

数据范围:

对于 100%的数据:1<=n<=300,1<=vi,aij<=100000,保证aii=0,aij=aji

建一个0号节点,把每个节点向它连一条权值为Vi的无向边,对于每两个点,连一条权值为a[i][j]的无向边,跑最小生成树

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[310][310],d[310],ans=0;
bool used[310];
int main()
{
    //freopen("zzi.in","r",stdin);freopen("zzi.out","w",stdout);
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i][0]);a[0][i]=a[i][0];a[0][0]=0;
    }
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);
    memset(d,127,sizeof(d));d[0]=0;
    for(int i=0;i<=n;i++)
    {
        int u=-1;
        for(int j=0;j<=n;j++)if(!used[j]&&(u==-1||d[j]<d[u]))u=j;
        ans+=d[u];used[u]=1;
        for(int v=0;v<=n;v++)d[v]=min(d[v],a[u][v]);
    }
    printf("%d",ans);
    return 0;
}
时间: 2024-10-25 14:24:49

20170910校内训练的相关文章

「csp校内训练 2019-10-24」解题报告

「csp校内训练 2019-10-24」解题报告 T1.猴猴吃苹果 \(Description\) 猴猴最喜欢在树上玩耍,一天猴猴又跳上了一棵树,这棵树有 \(N \ (N \leq 50000)\) 个苹果,每个苹果有一个编号,分别为 \(0\) ~ \(N - 1\) 它们之间由 \(N-1\) 个树枝相连,猴猴可以从树枝的一端爬到树枝的另一端,所以猴猴可以从任意一个苹果的位置出发爬到任意猴猴想去的苹果的位置. 猴猴开始在编号为 \(K \ (K < N)\) 的苹果的位置,并且把这个苹果吃

「csp校内训练 2019-10-30」解题报告

「csp校内训练 2019-10-30」解题报告 T1.树 题目链接(逃) \(Description\): 现在有一棵树,共 \(N\) 个节点. 规定:根节点为 \(1\) 号节点,且每个节点有一个点权. 现在,有 \(M\) 个操作需要在树上完成,每次操作为下列三种之一: \(1 \ x \ a\):操作 \(1\),将节点 \(x\) 点权增加 \(a\). \(2 \ x \ a\):操作 \(2\),将以节点 \(x\) 为根的子树中所有点的权值增加 \(a\). \(3 \ x\)

2017-4-7校内训练

丧病hzwer的ctsc训练赛 My AC:3/4 A.[Ctsc2014]企鹅QQ 思路:乱hash,我比较菜,写的丑代码各种WA+TLE,好久才A掉. #include<cstdio> #include<algorithm> using namespace std; #define ll long long #define MN 200 #define MX 6000000 #define MM 9000001 #define MOD1 890123798112473LL st

2017-3-3校内训练

hzwer出丧题虐人啦 ACM赛制 4/7 A.恼人的青蛙 题目大意:给定N*M矩阵上K个点,定义一条合法路径为从矩形外一点沿一条直线穿过矩形,每次走相同长度且在矩形内每步都要踩在给定点上,问经过给定点最多的路径经过几个点(若小于3输出0)(N,M,K<=5000). 思路:把点按横坐标第一关键字纵坐标第二关键字排序,f[i][j]表示有一条到i的路径,i上一个点是j,此时路径经过点数,每次确定i,j后就可以根据i,j算出j再前一个点的坐标,直接转移,复杂度O(K^2).评测机极慢稍微卡卡常才能

【三中校内训练】旅行

[题解] 显然的这是一道树形DP的题目 这里令f[i][0]为从i出发向以它为根的子树里走直到不能走的最大.最小价值 (不能走是什么自己阅读题目) 令s为x的儿子,w[i][j]为i和j之间的边的长度,则 f[x][0]=max(f[s][1]+w[s][i]) f[x][1]=min(f[s][0]+w[s][i]) 显然的通过这种方法,我们可以得到60分 可是,如何优化到线性呢 我们考虑一个节点x,x向某条边走的情况出现了很多次,浪费了很多时间 我们定义h[x][0/1]为从x出发,经过x的

校内训练0609 problem c

[题目大意] 给一棵树,求有多少条路径满足总和-最大值 是P的倍数 n<=10^5, P<=10^7 [题解] 一看就是点分治嘛 不考虑子树合并,考虑poj1741的做法,每次考虑经过重心的路径,用优先队列,从小到达添加并求答案即可. 容斥下. # include <queue> # include <stdio.h> # include <string.h> # include <iostream> # include <algorith

[3.10校内训练赛]

真的报警啦,hzwer又出一堆丧题虐人啦..... ------------------------------------------- A.[poj-1190]生日蛋糕 要做一个m层的蛋糕,每一层有高度和半径,且要分别比它上面的那一层的高度和半径大至少一,给定总体积n,求最小的侧面和顶上的面积之和m<=20,n<=10000 搜索....但是要加上比较强的剪枝. 1.如果此时的半径和高度无法建出剩余体积那么大的蛋糕,剪掉.这种情况我们不考虑半径和高度的减小,直接用((r-1)^2+(h-1

20170908校内训练

题意: 学过博弈论的同学都知道Nim游戏后手必胜的条件是异或和为0给定一棵树 ,支持修改单点点权,询问链上异或和 预处理每个点到根的路径的异或和由于异或的特殊性质,在求链x->y的异或和的时候,我们只需要知道x到根的异或和,y到根的异或和,将他们异或起来,最后异或上lca处的值即可. 如图,查询两个灰色节点的异或和 如果一个点的值被修改,那么它和它的子树到根的路径的异或和的值都会被修改 所以,我们维护一棵dfs序为下标的线段树,线段树的sum意义是它的区间的值的异或和 修改一个值,如果该值为x,

[3.16校内训练赛]

这次一个学长出题....结果我把dij写成了大顶的,就说复杂度那么科学怎么T了.........真的丢人 ------------------------------- A.给定一个长度为n的序列,你要求出从那个位置开始连续数n个数,得到的序列最大(先比第一位,再第二位..).n<=2000000 题解:第一眼想到的是可以把每个数拆开来计数排序+dc3后缀数组,应该可过. 但是此题还有一个非常妙的解法. 假设目前最优的开头是i,你要判断开头为j的是否更优,那么你可以找到第一位不同的位k,即s[i