校内集训(20170906)

emmmm又是200.。

我大概是永远不会AK?T3我都想到算法了。。(掀桌~)

切入正题吧。

——————————————————我是分割线——————————————————

T1:切糕(cut)

【问题描述】

小R意外获得了一块切糕,他准备把切糕分给n个小伙伴。切糕的形状是一个底边长为a,高为b的等腰三角形。小R打算横着或竖着切n-1刀把切糕切成面积相等的n块分给小伙伴,请你告诉他要在哪些地方切。

【输入格式】

输入文件cut.in

输入包含四个整数n,a,b,c,表示要切成n块,切糕的三个顶点分别位于(0,0),(a,0),(a/2,b),若c=0,表示要横着切;若c=1,表示要竖着切。

【输出格式】

输出文件cut.out

输出共n-1行,每行一个实数,从小到大输出各切割处的位置,若c=0,每输出一个整数a,表示在直线y=a处切一刀;若c=1,每输出一个整数a,表示在直线x=a处切一刀。当你的输出与标准输出的绝对误差不超过时,判为正确。

【样例输入1】

3 5 2 0

【样例输出1】

0.3670068381

0.8452994616

【样例输入2】

2 5 3 1

【样例输出2】

2.5

【数据范围】

对于全部数据,2<=n<=1000,1<=a,b<=10^5;

对于50%的数据,c=0;

对于另外50%的数据,c=1。

——————————————————我是分割线——————————————————

这题就是暴力模拟切在哪。当然,像学长一样写一个O(1)放扫描线的数论方法当然也是可以的啦;。

我是二分+暴力emmmm

下面贴代码

#include<cstdio>
using namespace std;
double a,h;
int n,c;
int main(){
    freopen("cut.in","r",stdin);
    freopen("cut.out","w",stdout);
    scanf("%d%lf%lf%d",&n,&a,&h,&c);
    if(c==0){
        double last=0,now=(a*h)/(double)(2*n),tot=(a*h)/2.0;
        double xie=a/h;
        for(int i=1;i<n;i++){
            double l=last,r=h;
            for(int j=1;j<=100;j++){
                double mid=(l+r)/2.0;
                if(tot-(h-mid)*xie*(h-mid)/2.0<now)l=mid;
                else r=mid;
            }
            tot=(h-l)*xie*(h-l)/2.0;
            printf("%.14lf\n",l);
        }
    }else {
        double qaq[1005];
        int ss=0;
        double last=0,now=(a*h)/(double)(2*n),tot=0;
        double xie=2.0*h/a;
        for(int i=1;i<=(n-1)/2;i++){
            double l=last,r=a/2.0;
            for(int j=1;j<=100;j++){
                double mid=(l+r)/2.0;
                if(mid*mid*xie/2.0-tot<now)l=mid;
                else r=mid;
            }
            tot=l*l*xie/2.0;last=l;
            printf("%.14lf\n",l);qaq[++ss]=l;
        }
        if((n-1)%2==1)printf("%.14lf\n",a/2.0);
        tot=a*h/4.0;
        for(int i=ss;i>=1;i--)printf("%.14lf\n",a-qaq[i]);
    }
    fclose(stdin);
    fclose(stdout);
}

——————————————————我是分割线——————————————————

T2:采购(buy)

【问题描述】

小R有一个爱好,他经常去杂货市场上采购一些奇奇怪怪的物品。今天小R来到市场,发现有n个摊位,每个摊位出售不同的货物,第i个摊位出售的货物价格为ai。这些摊位的老板很奇怪,他们不喜欢你购买其他摊位的物品,如果你购买了k件其他摊位的物品,你在购买第i个摊位出售的物品时需要额外支付k*bi的钱,为了防止你买完一个摊位的物品后再去买另一家的物品,他们商量好要求你同时结账,现在小R有m元钱,他想知道自己最多能买多少种不同的物品。

【输入格式】

输入文件buy.in

第一行两个正整数n和m,表示摊位数和小R的钱数。

接下来n行,每行两个非负整数ai,bi,意义同问题描述。

【输出格式】

输出文件buy.out

输出一个非负整数,表示答案。

【样例输入】

3 7

1 3

2 1

3 0

【样例输出】

2

【数据范围】

对于20%的数据,n<=20;

对于40%的数据,n<=1000;

对于另外10%的数据,bi=0;

对于另外20%的数据,所有bi均相等;

对于100%的数据,n,ai,bi<=100,000,m<=10^9。

——————————————————我是分割线——————————————————

这题、。。。。不就是二分枚举取几个,然后暴力给一个新的数组sort嘛。。都不想说啥。

下面贴代码

#include<cstdio>
#include<algorithm>
#define MN 100005
using namespace std;
long long n,m;
int ans;
long long b[MN],sum[MN],a[MN];
int main(){
    freopen("buy.in","r",stdin);
    freopen("buy.out","w",stdout);
    scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i],&b[i]),sum[i]=a[i];
    int l=0,r=n;
    while(l<=r){
        int mid=(l+r>>1);
        for(int i=1;i<=n;i++)sum[i]=a[i]+(mid-1)*b[i];
        sort(sum+1,sum+n+1);
        long long tot=0;
        for(int i=1;i<=mid;i++)tot+=sum[i];
        if(tot>m)r=mid-1;
        else l=mid+1,ans=mid;
    }
    printf("%d\n",ans);
    fclose(stdin);
    fclose(stdout);
}

注意long long就好啦

——————————————————我是分割线——————————————————

T3:能量(power)

【问题描述】

小R在某次杂货采购中买到了n个XOR能量石,每个能量石有一个能量系数ai和共鸣系数bi,其中能量系数决定了能量石的好坏。小R想知道这些能量石的品质,但能量系数无法简单观测得到,只有通过能量共鸣仪促使能量石之间发生共鸣,才有办法获知能量系数。能量共鸣仪每次可以使一个区间内的所有能量石发生共鸣,并且获知这些能量石能量系数的异或和,但需要消耗等同于区间内所有能量石共鸣系数异或和的能量。小R已经测量出了各个能量石的共鸣系数,现在他想知道至少需要多少能量才能确定所有能量石的能量系数。

【输入格式】

输入文件power.in

第一行一个正整数n,表示能量石的个数。

第二行n个整数bi,表示各个能量石的共鸣系数。

【输出格式】

输出文件power.out

输出一个整数,表示最小的能量花费。

【样例输入】

2

1 3

【样例输出】

3

【数据范围】

对于20%的数据,n<=10;

对于50%的数据,n<=100;

对于70%的数据,n<=1,000;

对于100%的数据,n<=10,000,0<=bi<2^31。

——————————————————我是分割线——————————————————

最气的就是这题啦。我都想到了用mst(最小生成树来做了,没想到可以用prim暴力过啊,而且局部最优性也没有想到,就是为如何单独查找一个点而烦恼了一下,其实直接prim硬上就好了,kruskal反而不好写。。。我是假人,没有认真考虑问题)

我们想到对于一个区间查询比如[l,r]那么其实我们就是从l到r连了一条权值为a[l]^a[l+1]^...^a[r]的边,然后我们可以前缀和处理连边。。然后就没了。、

我都做过啊!!都想到了原题还不会做。。。我就是个大**(心累)

#include<cstdio>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int num[10005],f[10005],n,qaq;
long long ans;
bool v[10005];
int main(){
    freopen("power.in","r",stdin);
    freopen("power.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&qaq),f[i]=num[i]=num[i-1]^qaq;
    for(int i=1;i<=n;i++){
        int best=0;
        for(int j=1;j<=n;j++)if(!v[j]&&(!best||f[j]<f[best]))best=j;
        v[best]=1;ans+=(long long)f[best];
        for(int j=1;j<=n;j++)if(!v[j])f[j]=min(f[j],num[j]^num[best]);
    }
    printf("%lld\n",ans);
    fclose(stdin);
    fclose(stdout);
}

200还是太弱啊,都被falldream学长D的飞起啦!cf最近一天才2题,感觉脸都丢尽了(大概是我菜吧)

唉,接着努力吧,游戏先扔掉好了(虽然最近没打,不过被老师和同学各种D,还是声明一下好了QAQ)

时间: 2024-10-25 11:05:42

校内集训(20170906)的相关文章

校内集训(20170910)

T1打挂怒丢rank 1(人生要不要这么残酷) 果然AK一次之后就会砸 刚好碰到洛谷打卡大凶(划掉) ------------------我是分割线-------------------- T1:CCT 最近学校又发了n本五三题霸,BBS看到后十分高兴.但是,当他把五三拿到手后才发现,他已经刷过这些书了!他又认真地看了一会儿,发现新发的这些五三是2017版的,而他刷的是2016版的.现在他想找出所有他没有刷过的题来刷.每本五三都有m道题,并且它的特征(即它和去年版本的五三的差距)可以用一个m位二

校内集训 miku set模拟冒泡排序 逆序对

题意 给你一个长为\(n\)的序列,进行\(m\)次操作,每次对一个区间进行排序,求最后的序列\((n <= 1500, m <= 1e6)\) 这道题目思维难度挺大的 对于一个序列,排序的本质就是消除里面的所有逆序对 考虑冒泡排序的过程,每次也是交换\(a[i]>a[i+1]\)这个逆序对 这样子交换最多有\(n^2\)次 那么我们可以用一个数据结构模拟冒泡排序交换逆序对这个过程 用一个\(set\)维护所有逆序对的位置 每次暴力删除区间内所有逆序对 再把新产生的逆序对加入\(set\

[CSP校内集训]贪吃蛇(阿尔法-贝塔剪枝)

题目 有两条蛇(1号蛇和2号蛇)在n行m列的地图上,地图上有障碍物.一条蛇碰到蛇身/障碍物/边界就会死.蛇身会不断长长--可以理解为蛇尾位置不会变,蛇只会向前伸展不会缩尾巴.两条蛇都绝顶聪明,如果自己能赢,一定会尽量快地赢;如果自己会输,一定会死得尽量晚.给出初始局面,两蛇轮流走,每次可以且必须向上下左右移动一格.1号蛇先走,请告诉我谁会在多少回合时赢.\((n,m\leq 20)\)且\(0\)的数量不超过\(50\) \(\alpha - \beta\)剪枝 AlphaBeta剪枝算法是一个

[CSP校内集训]attack(DAG支配树)

题意 给一个DAG,多次询问,每次给定\(k\)个点,求1到这些点的必经点的交集大小 思路 支配树裸题,建好DAG的支配树后\(k\)个点LCA的深度即为答案 Code #include<bits/stdc++.h> #define N 100005 using namespace std; int n,m,q; int rd[N],f[N][18],dep[N]; struct Edge { int next,to; }edge[N<<1],edge1[N<<1];i

[CSP校内集训]tree(期望DP)

题意 给一颗树,从1节点出发,走每条边的概率相同且耗时为1,求每个点第一次被遍历到的期望时间(\(t_1=1\)) 思路 在树上只有两种移动方式:从儿子到父亲,从父亲到儿子 假设从\(rt\)走到\(v\)的期望代价为\(dow_i\),从\(i\)走到\(rt\)的期望代价为\(val_i\) 假设从\(rt\)转移到\(v\),\(rt\)的度数为\(k\),\(rt\)的父亲为\(fa\),则: \[dow_v = \frac{1}{k} + \sum_{son}^{son\neq v}

[CSP校内集训]rank

题意 给出一个字符串后缀排序之后的数组\(sa_i\),求原字符串(字典序最小),无解输出-1 思路 显然从\(rk_1\)开始填字符是可以保证字符单调不降的 找到\(sa\)值相邻的两个位置,现在需要知道\(rk_i\)和\(rk_{i+1}\)是否可以填相邻字符:当它们填相同字符时需要比较后一位,如果相对关系相同则可行(因为后一位默认已经成立) 举个栗子:\(4,2,3,1\),查看4能不能和3填同一个字符,则判断后一位2和1:而\(4>3 \&\& 2>1\),所以可以相

[CSP校内集训]矩形面积交(树状数组)

题意 给\(n\)个互不相交的矩形,再给\(m\)个询问,每次给一个矩形求它与这\(n\)个矩形的面积交 思路 自己写的太丑了导致DEBUG了一个半小时qwq 一对矩形的交可以拆分成二维前缀和形式下的矩形的交,于是变成判断16次矩形的交(不想画图...只想口胡) 这些矩形都有\(x_0=0,y_0=0\),即左下角为坐标原点,于是一个矩形可以只用右上角的坐标表示: 对于一个询问的矩形\((x,y)\)和另一个矩形\((x_i,y_i)\),它们的交为\(min(x,x_i)\times min(

[CSP校内集训]pestc(拓扑排序)

题意 给一个边带权的有向图,可以花费边权使得一条边反向:通过翻转边让原图变成一个DAG,要求是所有花费中的最大值最小\(,(n,m\leq 200000)\),保证无重边和自环 解法1 考场上没看出来性质,于是口胡了一个乱搞做法 连好边后直接对原图进行一遍拓扑排序,由于原图不是DAG,所以会有无法入队的环存在:如果当前队列为空而有点没有被遍历到,那么就强行选择一个点将连向它的边翻转: 具体的,我们选择\((max(\) 连向\(i\)的边 \())\)最小的\(i\),由于翻转了连向\(i\)的

2017.5 校内预选赛 A H

题目描述: 目前图像识别是一项非常热门的技术,最流行的莫不过是深度学习的图像识别,识别率甚至能达到99%以上.当然,对于简单的图像来说,深度学习是没有必要的.比如如果要识别安徽拼音的首字母A和H,就可以不用深度学习就可以判断.现在有一些只含A或者H的图像,你知道该如何识别吗? 输入描述: 第一行输入正整数T,表示数据的组数. 每组数据中,第一行是两个正整数n和m,表示图像的大小. 接下来有n行,每行m个字符,只可能为'.'或者'#'.'.'表示白色,'#'表示黑色.'#'会通过上下左右或者左上左