2017.9.10所谓“切题如切菜杯”水题模拟赛(;´д`)ゞ

T1:MHM

LGL今天一共要上n节课,这n节课由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,1<=k<=m<=50000,0<ai<n。

solution:

看题目了半天,这难道不是noip2015的跳石头的几乎是原题的变形吗。二分答案判定,废话不多说,直接上代码:

 1 #include<cstdio>
 2 int l,n,m,a[50005],L;
 3 int check(int x) {
 4     int last=0,ans=0;
 5     for(int i=1;i<=n;i++){
 6         if(a[i]-last<x) ans++;
 7         else last = a[i];
 8     }
 9     if(ans>m)return 0;
10     return 1;
11 }
12 int main(){
13     scanf("%d%d%d",&L,&n,&m);
14     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
15     a[n+1]=L; n++;
16     int l=0,r=L;
17     while(l<=r) {
18         int mid=(l+r)/2;
19         if(check(mid)) l=mid+1;
20         else r=mid-1;
21     }
22     printf("%d\n",l);
23 }

T2: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。

solution:

按截止时间排序从头往后选。选到第i个时,若已选择的题目数量小于ti,则该时间选择它一定更优;若已选择的数量等于ti,则比较第i题的收益和已选择的题目中的最小收益,在酌情选择。我没用队列维护这题10分。。。

#include <cstdio>
#include <algorithm>
#include <queue>
typedef long long ll;
struct work
{
    ll d,p;
}w[100001];
std::priority_queue<int,std::vector<int>,std::greater<int> > q;
int n;
ll sz,ans;

bool comp(work a,work b)
{
    return a.d<b.d;
}

int main()
{
    freopen("aafa.in","r",stdin);
    freopen("aafa.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%I64d%I64d",&w[i].d,&w[i].p);
    std::sort(w+1,w+1+n,comp);
    ans=0;
    for(int i=1;i<=n;i++)
    {
        sz=q.size();
        if(sz<w[i].d) q.push(w[i].p);
        else if(sz==w[i].d)
        {
            if(q.top()<w[i].p)
            {
                q.pop();
                q.push(w[i].p);
            }
        }
    }
    ans=0;
    while(!q.empty())
    {
        ans+=q.top();
        q.pop();
    }
    printf("%I64d",ans);
    return 0;
}

T3: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

solution:

几乎裸最小生成树,prim算法,具体参考[USACO Oct08] 挖水井 。

#include<iostream>
#include<cstdio>
using namespace std;
int n,dis[305],e[305][305],t,w,ans;
bool flag;
int main(){
    freopen("zzi.in","r",stdin);
    freopen("zzi.out","w",stdout);
    scanf("%d",&n);
    dis[0]=(1<<30);
    for(int i=1;i<=n;i++){
        scanf("%d",&dis[i]);
        if(dis[i]<dis[0]){
            dis[0]=dis[i];
            t=i;
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%d",&e[i][j]);
        }
    }
    ans+=dis[0];
    dis[t]=0;
    for(int j=1;j<=n;j++){
        if(dis[j]>e[t][j]){
            dis[j]=e[t][j];
        }
    }
    for(int i=1;i<=n-1;i++){
        w=(1<<30);
        for(int j=1;j<=n;j++){
            if(dis[j]<w&&dis[j]!=0){
                w=dis[j];
                t=j;
            }
        }
        ans+=w;
        dis[t]=0;
        for(int j=1;j<=n;j++){
            if(dis[j]>e[t][j]){
                dis[j]=e[t][j];
            }
        }
    }
    printf("%d\n",ans);
    return 0;
}
时间: 2024-10-15 03:11:20

2017.9.10所谓“切题如切菜杯”水题模拟赛(;´д`)ゞ的相关文章

20170925“切题如切菜杯”水题模拟赛 第二弹

T1:短 给出一张有n个点和m条双向边的图,要求求出1到n的次短路的长度.一条边可以多次通过. 输入格式: 第一行为两个整数n和m.接下来的m行每行三个整数ai,bi,vi,分别表示这条路连着的两个点和他的长度. 输出格式: 一个整数,表示次短路的长度. 样例输入 样例输出 4 41 2 1002 4 2002 3 2503 4 100 450 样例解释: 最短:1->2->4. 次短:1->2->3->4. 数据范围: 对于 100%的数据:1<=n.vi<=5

第一期周二航拍视频分享 2017/07/10

2017/07/10 分享方式:1.讲解航拍镜头语言 2.以一个经典视频为例讲解其中所用到的航拍语言  3.最后再看一个视频,同时大脑应思考视频中出现的镜头语言 1.讲解航拍镜头语言 航拍基本动作 直飞 1.直线向前飞,镜头向前: 这是最常用的手法之一,一般拍摄海岸线.沙漠.山脊.笔直的道路等等也多用这种手法. 画面中镜头向前移动,也可从地面慢慢抬头望向远处,镜头一气呵成. 2.直线向前飞,镜头俯瞰: 正俯的镜头常用于拍摄城市.森林,特别是一条笔直的路.一排整齐的车辆,树,房子等等. 直线向前飞

【第三组】冲刺会议 2017.7.10

冲刺会议 日期:2017.7.10 开发小组:Geomestry 冲刺经理:程立智 成员: 程立智 李明伦 郑昊 蔡镇泽 温志成 汪涵 成员:程立智 完成工作:界面分析,可行性分析 所遇问题:unity2d与uwp结合不成功 下一步工作:开发界面 成员:李明伦 完成工作:可行性分析 所遇问题:unity2d与uwp结合不成功 下一步工作:学习win2d 成员:郑昊 完成工作:界面分析,可行性分析 所遇问题:unity2d与uwp结合不成功 下一步工作:开发界面 成员:蔡镇泽 完成工作:可行性分析

2017年10月31日结束Outlook 2007与Office 365的连接

2017 年10月31日 ,微软即将推出 Office 365中Exchange Online邮箱将需要Outlook for Windows的连接,即通过HTTP Over MAPI方式,传统使用RPC over HTTP(例如Outlook 2007)的Windows客户端的Outlook将无法访问Exchange Online邮箱,不再支持. RPC over HTTP协议,也称为Outlook Anywhere,是Windows OS系统 Outlook客户端和Exchange 服务器之

Alpha周(2017年10月19)贡献分配规则和分配结果

.从alpha周(2017年10月19日开始的2周)开始,提高贡献分比重. 贡献分 : 团队分 = 1 : 5 教师会在核算每位同学总分时按比例乘以系数. 每位同学带入团队贡献分10分,如果团队一共7位同学,则共有贡献分10*7=70分用于分配. 对贡献分评定的规定要求,每两位同学贡献分不得相同,并且贡献分精确到整数,不得包括小数. 1 基础分:每人4分       2 个人贡献分:按照leangoo里面的卡片数进行百分比给分(个人卡片数/总卡片数) 冉华 9 田继平 6 王伟东 8 李园园 7

蓝桥杯——真题训练之蚂蚁感冒

标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂蚁感冒了.并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁. 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒. [数据格式] 第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数. 接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100),

2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&amp;源码

Problem A: pigofzhou的巧克力棒 Description 众所周知,pigofzhou有许多妹子.有一天,pigofzhou得到了一根巧克力棒,他想把这根巧克力棒分给他的妹子们.具体地,这根巧克力棒长为 n,他想将这根巧克力棒折成 n 段长为 1 的巧克力棒,然后分给妹子们. 但是他妹子之一中的 15zhazhahe 有强迫症.若它每次将一根长为 k 的巧克力棒折成两段长为 a 和 b 的巧克力棒,此时若 a=b,则15zhazhahe会得到一点高兴值. pigofzhou想知

2014山东省“浪潮杯”第五届ACM省赛总结

一次比赛做一次总结,弱菜又来总结了-- 我这种大四的又死皮赖来混省赛了,貌似就我和山大威海的某哥们(不详其大名)了吧.颁奖前和他聊天,得知他去百度了,真是不错,ORZ之. 比赛流水账: 题目目前不知道哪有,过几天填坑. 没发题目前,我们赌A题可能是水题,由于我是主coder,我去读A,剩下的一个从前往后,一个从后往前. 结果--,看到A有一个貌似是几何的图--,我还是硬头皮读了.读到一半,3分钟刷榜,发现E有出,让ZK读E,ZK先告诉我了B题题意,转而读E.B题是一个有环形关系的期望,我扫了一下

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl