2017北京国庆刷题Day1 afternoon

期望得分:100+100+100=300

实际得分:100+100+100=300

T1 一道图论好题(graph)

Time Limit:1000ms   Memory Limit:128MB

题目描述

LYK有一张无向图G={V,E},这张无向图有n个点m条边组成。并且这是一张带权图,不仅有边权还有点权。

LYK给出了一个子图的定义,一张图G’={V’,E’}被称作G的子图,当且仅当

·G’的点集V’包含于G的点集V。

·对于E中的任意两个点a,b∈V’,当(a,b)∈E时,(a,b)一定也属于E’,并且连接这两个点的边的边权是一样的。

LYK给一个子图定义了它的价值,它的价值为:点权之和与边权之和的比。

LYK想找到一个价值最大的非空子图,所以它来找你帮忙啦。

输入格式(graph.in)

第一行两个数n,m表示一张n个点m条边的图。

第二行n个数ai表示点权。

接下来m行每行三个数u,v,z,表示有一条连接u,v的边权为z的无向边。数据保证任意两个点之间最多一条边相连,并且不存在自环。

输出格式(graph.out)

你需要输出这个价值最大的非空子图的价值,由于它是一个浮点数,你只需要保留小数点后两位有效数字。

输入样例

3 3

2 3 4

1 2 3

1 3 4

2 3 5

输出样例

1.67

样例解释

选择1,2两个点,则价值为5/3=1.67。

对于20%的数据n=2

对于50%的数据n<=5

对于100%的数据1<=n,m<=100000,1<=ai,z<=1000。

最优解一定是一条边+两个点

考场上是二分答案,然后枚举所有的边,只要有一个满足点-边*答案>=0 就return true

std直接 ans=max(ans,(a[A]+a[B])/(C+0.0));

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 100001
using namespace std;
int n,m;
int point[N];
struct node
{
    int u,v,w;
}e[N];
const double eps=1e-4;
void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-‘0‘; c=getchar(); }
}
bool check(double k)
{
    for(int i=1;i<=m;i++)
        if(point[e[i].u]+point[e[i].v]-k*e[i].w>=0) return true;
    return false;
}
int main()
{
    freopen("graph.in","r",stdin);
    freopen("graph.out","w",stdout);
    read(n); read(m);
    int maxn=0;
    for(int i=1;i<=n;i++)
    {
        read(point[i]);
        maxn=max(maxn,point[i]);
    }
    int minn=1e9;
    for(int i=1;i<=m;i++)
    {
        read(e[i].u); read(e[i].v); read(e[i].w);
        minn=min(minn,e[i].w);
    }
    double l=0,r=maxn*2*1.0/minn,mid,ans;
    while(fabs(r-l)>eps)
    {
        mid=(l+r)/2;
        if(check(mid)) ans=mid,l=mid+eps;
        else r=mid-eps;
    }
    printf("%.2lf",ans);
}

T2拍照(photo)

Time Limit:1000ms   Memory Limit:128MB

题目描述

假设这是一个二次元。

LYK召集了n个小伙伴一起来拍照。他们分别有自己的身高Hi和宽度Wi。

为了放下这个照片并且每个小伙伴都完整的露出来,必须需要一个宽度为ΣWi,长度为max{Hi}的相框。(因为不能叠罗汉)。

LYK为了节省相框的空间,它有了绝妙的idea,让部分人躺着!一个人躺着相当于是身高变成了Wi,宽度变成了Hi。但是很多人躺着不好看,于是LYK规定最多只有n/2个人躺着。(也就是说当n=3时最多只有1个人躺着,当n=4时最多只有2个人躺着)

LYK现在想问你,当其中部分人躺着后,相框的面积最少是多少。

输入格式(photo.in)

第一行一个数n。

接下来n行,每行两个数分别是Wi,Hi。

输出格式(photo.out)

你需要输出这个相框的面积最少是多少。

输入样例

3

3 1

2 2

4 3

输出样例

21

样例解释

如果没人躺过来,需要24的面积。

我们只要让第1个人躺过来,就只需要21的面积!

对于30%的数据n<=10。

对于60%的数据n<=1000,Wi,Hi<=10。

对于100%的数据1<=n,Wi,Hi<=1000。

枚举高度,贪心累计宽度

#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 1001
using namespace std;
int n;
int w[N],h[N],nw[N],nh[N],tmp[N];
void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-‘0‘; c=getchar(); }
}
int work(int maxh)
{
    int change=0,tot=0;
    for(int i=1;i<=n;i++)
    {
        if(h[i]>maxh)
        {
            if(w[i]>maxh) return 0;
            if(change==n/2) return 0;
            change++; nw[i]=h[i]; nh[i]=w[i];
        }
        else
        {
            nw[i]=w[i]; nh[i]=h[i];
            if(nw[i]>nh[i])
            {
                if(nw[i]>maxh) continue;
                tmp[++tot]=nw[i]-nh[i];
            }
        }
    }
    int sum=0;
    for(int i=1;i<=n;i++) sum+=nw[i];
    int res=n/2-change;
    sort(tmp+1,tmp+tot+1,greater<int>());
    for(int i=1;i<=res;i++) sum-=tmp[i];
    return sum;
}
int main()
{
    freopen("photo.in","r",stdin);
    freopen("photo.out","w",stdout);
    read(n);
    for(int i=1;i<=n;i++)
    {
        read(w[i]); read(h[i]);
    }
    int ans=1e9,t;
    for(int i=1;i<=1000;i++)
    {
        t=work(i);
        if(t) ans=min(ans,i*t);
    }
    printf("%d",ans);
}

T3或和异或(xor)

Time Limit:2000ms   Memory Limit:128MB

题目描述

LYK最近在研究位运算,它研究的主要有两个:or和xor。(C语言中对于|和^)

为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组。它第一次先对所有相邻两个数执行or操作,得到一个2^(n-1)长度的数组。也就是说,如果一开始时a[1],a[2],…,a[2^n],执行完第一次操作后,会得到a[1] or a[2],a[3] or a[4] ,…, a[(2^n)-1] or a[2^n]。

第二次操作,LYK会将所有相邻两个数执行xor操作,得到一个2^(n-2)长度的数组,假如第一次操作后的数组是b[1],b[2],…,b[2^(n-1)],那么执行完这次操作后会变成b[1] xor b[2], b[3] xor b[4] ,…, b[(2^(n-1))-1] xor b[2^(n-1)]。

第三次操作,LYK仍然将执行or操作,第四次LYK执行xor操作。如此交替进行。

最终这2^n个数一定会变成1个数。LYK想知道最终这个数是多少。

为了让这个游戏更好玩,LYK还会执行Q次修改操作。每次修改原先的2^n长度的数组中的某一个数,对于每次修改操作,你需要输出n次操作后(最后一定只剩下唯一一个数)剩下的那个数是多少。

输入格式(xor.in)

第一行两个数n,Q。

接下来一行2^n个数ai表示一开始的数组。

接下来Q行,每行两个数xi,yi,表示LYK这次的修改操作是将a{xi}改成yi。

输出格式(xor.out)

Q行,表示每次修改操作后执行n次操作后剩下的那个数的值。

输入样例

2 4

1 6 3 5

1 4

3 4

1 2

1 2

输出样例

1

3

3

3

样例解释

第一次修改,{4,6,3,5}->{6,7}->{1}

第二次修改,{4,6,4,5}->{6,5}->{3}

第三次修改,{2,6,4,5}->{6,5}->{3}

第四次修改,{2,6,4,5}->{6,5}->{3}

对于30%的数据n<=17,Q=1。

对于另外20%的数据n<=10,Q<=1000。

对于再另外30%的数据n<=12,Q<=100000。

对于100%的数据1<=n<=17,1<=Q<=10^5,1<=xi<=2^n,0<=yi<2^30,0<=ai<2^30。

线段树,std倍增

#include<cstdio>
#include<iostream>
#define N 131073
using namespace std;
int n,m;
int sum[N<<2],mid[N<<2];
void read(int &x)
{
    x=0; char c=getchar();
    while(!isdigit(c)) c=getchar();
    while(isdigit(c)) { x=x*10+c-‘0‘; c=getchar(); }
}
void build(int k,int l,int r,int dep)
{
    if(l==r) { read(sum[k]); return; }
    mid[k]=l+r>>1;
    build(k<<1,l,mid[k],dep+1);
    build(k<<1|1,mid[k]+1,r,dep+1);
    if((n-dep+1)&1) sum[k]=(sum[k<<1]|sum[k<<1|1]);
    else sum[k]=(sum[k<<1]^sum[k<<1|1]);
}
void change(int k,int l,int r,int pos,int w,int dep)
{
    if(l==r) { sum[k]=w; return; }
    if(pos<=mid[k]) change(k<<1,l,mid[k],pos,w,dep+1);
    else change(k<<1|1,mid[k]+1,r,pos,w,dep+1);
    if((n-dep+1)&1) sum[k]=(sum[k<<1]|sum[k<<1|1]);
    else sum[k]=(sum[k<<1]^sum[k<<1|1]);
}
int main()
{
    freopen("xor.in","r",stdin);
    freopen("xor.out","w",stdout);
    read(n); read(m);
    int s=1<<n;
    build(1,1,s,1);
    int x,y;
    while(m--)
    {
        read(x); read(y);
        change(1,1,s,x,y,1);
        printf("%d\n",sum[1]);
    }
}

时间: 2024-10-15 00:17:47

2017北京国庆刷题Day1 afternoon的相关文章

2017北京国庆刷题Day1 morning

期望得分:100+100+100=300 实际得分:100+100+70=270 T1位运算1(bit) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N所拥有的价值.例如数字123拥有6的价值,数字999拥有27的价值. 假设数字N的价值是K,LYK想找到一个价值是K-1的数字,当然这个答案实在太多了,LYK想使得这个价值为K-1的数字尽可能大. 输入格式(bit.in

qbxt济南国庆刷题班游记

DAY-3 今天就开始写是不是有点早啊... 算了不管了 今天下午我们一些人就回家了 为了更加努力学习躲避月考 我决定回家之后先恶补一下文化课 并自己先复习一下noip的考点 下午有场和外校的模拟赛比较害怕 晚上我就回家了~ DAY-2 今天打算补一下文化课然后国庆去专心搞OI 昨天一晚上没睡好难受啊~ 年级大了 DAY-1 今天下午我们就要去qbxt了 上午我在家准备了一下 希望能学到很多东西吧 毕竟没有人愿意失败 DAY 1 上午的整个状态就是 ??? 喵的爆零了!!! 算了随便打打吧...

省选/NOI刷题Day1

bzoj4864 Splay乱搞 bzoj3669 正解LCT,考虑上下界的spfa可过 bzoj3668 位运算 暴力 bzoj3670 KMP DP bzoj3671 含有最小的一个数的路径一定比不含的优 贪心 bzoj1564 按数值排序,就得到了那个Treap的中序遍历,用dp(l,r,k)表示l~r区间根节点权值不小于k的答案 ZOJ3201 树上背包 乱搞 bzoj1063 心疼NOI2008的同学们,两道树d...dp(i,j,k)表示以i为根的子树,不方便值最大为j,i向儿子连了

2017年11月1日刷题记录 | 普及组

写在前面 哇Cys好菜啊! 哇Cys连普及组都不会打了啊! 哇要Noip了好紧脏啊! 哇Cys要开始刷题了 然后重点是Cys好菜菜菜菜菜菜啊!!!! 以下题目来自题库比赛 Task-1  A-B 题目描述 出题是一件痛苦的事情! 题目看多了也有审美疲劳,于是我舍弃了大家所熟悉的A+B Problem,改用A-B了哈哈! 好吧,题目是这样的:给出一串数以及一个数字C,要求计算出所有A-B=C的数对的个数.(不同位置的数字一样的数对算不同的数对) 输入输出格式 输入格式: 第一行包括2个非负整数N和

LintCode刷题笔记(九章ladder PartOne)--BugFree

九章ladder的前半部分刷题笔记,在这次二刷的时候补上~ @ 2017.05.21 141 - sqrtx 二分答案 ---  binarySearch二分法 --- class Solution: """ @param x: An integer @return: The sqrt of x """ def sqrt(self, x): # write your code here if not x: return 0 start, end

BZOJ 刷题记录 PART 1

作者 : Dolphin 原文地址:http://blog.csdn.net/qingdujun/article/details/27109035 一.实体完整性定义 [例1]将Student表中的Sno属性定义为码. CREATE TABLE Student ( Sno CHAR(10) PRIMARY KEY, /*在列定义主码*/ Sname CHAR(20) NOT NULL, Sage SMALLINT ); 或者: CREATE TABLE Student ( Sno CHAR(10

华为HCNP R&amp;S 认证刷题方法

51CTO学院华为HCNP 4期一名学员刷题的自述,用自己血与泪的教训,为大家总结了刷题的方法,各位看官请睁眼!!! 引言自2017年10日报名,因为报名晚,没有跟上直播课,故每天看肖哥的4期直播回放,个人感觉肖哥的课程听起来通俗易懂,给人以豁然开朗的感觉:由于4期为全程直播课,而课时仅在2小时左右,造成很多知识未能深入讲解(也可能由于行业行情HCNP并不需要这样深入),后来看题库时果然让我有种我是学渣的觉悟,里面考题所涵盖的知识多得让我怀疑人生- - .而现实一次次告诉我们考证要趁早,毕竟老司

用js刷题的一些坑

leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也是引用对象,这点常常被忽视,所以在递归的时候传递数组要用arr.slice(0)这样复制一个一样的新数组,不然会出现你传入的数组会被同级的递归改变,结果就不对了. 所以只要数组复制的地方最好都要这么写,除非你真的想引用.而且注意是slice不是splice这两个方法差别很大,你如果用splice(0

LeetCode刷题之一:寻找只出现一次的数字

投简历的时候看到了个刷题网站,http://www.nowcoder.com/527604,就做了一套题,现记录下来. 题目为: Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it withou