10.1 模拟赛

由于算错了inf 又ak失败了 过于菜

T1 年轮蛋糕 loj 2758

题目大意:

n个数构成的环 把这个环分成三段 使最小的最大

求这个最小段的和的最大值

思路:

可以想到二分 因为log方可以过

所以可以二分长度后lower_bound找断点

或者使用滑动窗口

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 200100
13 using namespace std;
14 inline int read()
15 {
16     int x=0,f=1;char ch=getchar();
17     while(!isdigit(ch)) {if(ch==‘-‘)f=-1;ch=getchar();}
18     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
19     return x*f;
20 }
21 ll n,g[MAXN],s[MAXN],l,r,mid,ans;
22 bool cheque(ll x)
23 {
24     ll a,b,c,ax,bx;
25     if(x>s[n]/2) return 0;
26     for(int i=1;i<=n;i++)
27     {
28         a=lower_bound(s+1,s+2*n+1,x+s[i-1])-s,ax=s[a]-s[i-1];
29         if(a<n) b=lower_bound(s+1,s+2*n+1,ax+s[a])-s,bx=s[b]-s[a];
30         else b=lower_bound(s+1,s+2*n+1,ax+s[a-n])-s,bx=s[b]-s[a-n];
31         if(ax<=bx&&ax<=s[n]-ax-bx) return 1;
32     }
33     return 0;
34 }
35 int main()
36 {
37     n=read();
38     for(int i=1;i<=n;i++) g[i]=read(),s[i]=s[i-1]+g[i];
39     for(int i=n+1;i<=2*n;i++) s[i]=s[i-1]+g[i-n];
40     r=s[n];
41     while(l<=r)
42     {
43         mid=l+r>>1;
44         if(cheque(mid)) ans=mid,l=mid+1;
45         else r=mid-1;
46     }
47     printf("%lld",ans);
48 }

T2 最佳团体 bzoj 4753

题目大意:

在树上选k个人(联通且于根相连)使这写人的a权值和/b权值和最大

思路:

分数规划 二分之后dp

树上背包dp即可

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define inf 1001000
#define ll long long
#define MAXN 2600
#define eps 1e-5
using namespace std;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)) {if(ch==‘-‘)f=-1;ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
int k,n,prc[MAXN],val[MAXN],fa[MAXN],sz[MAXN];
double v[MAXN],dp[MAXN][MAXN];
int nxt[MAXN],fst[MAXN],to[MAXN],cnt;
void add(int u,int v) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v;}
void dfs(int x)
{
    sz[x]= x>0?1:0,dp[x][sz[x]]=v[x];
    for(int i=fst[x];i;i=nxt[i])
    {
        dfs(to[i]);
        for(int j=min(sz[x],k);j>=0;j--)
            for(int o=min(sz[to[i]],k);o>=0;o--)
                if(j+o<=k) {dp[x][j+o]=max(dp[x][j+o],dp[x][j]+dp[to[i]][o]);}
        sz[x]+=sz[to[i]];
    }
}
bool cheque(double x)
{
    for(int i=0;i<=n;i++)
        for(int j=0;j<=k+1;j++) dp[i][j]=-inf;
    for(int i=1;i<=n;i++) v[i]=val[i]-prc[i]*x;
    dfs(0);return dp[0][k]>=0;
}
int main()
{
    k=read(),n=read();
    for(int i=1;i<=n;i++) {prc[i]=read(),val[i]=read(),fa[i]=read();add(fa[i],i);}
    double l=0.0,r=1000.0,ans,mid;
    while(l<r+eps)
    {
        mid=(l+r)/2.0;
        if(cheque(mid)) ans=mid,l=mid+eps;
        else r=mid-eps;
    }
    printf("%.3lf",ans);
}

T3 起床困难综合症

题目大意:

给n个运算 求在0-m中的所有数经过运算后的最大值

思路:

按位贪心 每一位设该位初值为0/1 模拟即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<map>
10 #define inf 2139062143
11 #define ll long long
12 #define MAXN 300100
13 #define MOD 1000000007
14 using namespace std;
15 inline int read()
16 {
17     int x=0,f=1;char ch=getchar();
18     while(!isdigit(ch)) {if(ch==‘-‘)f=-1;ch=getchar();}
19     while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
20     return x*f;
21 }
22 int n,m,opt[MAXN],g[MAXN],ans,res,x,y,tmp;
23 int main()
24 {
25     n=read(),m=read();char s[6];
26     for(int i=1;i<=n;i++)
27     {
28         scanf("%s",s);if(s[0]==‘A‘) opt[i]=0;
29         else opt[i]= s[0]==‘O‘?1:2;
30         g[i]=read();
31     }
32     for(int t=30;t>=0;t--)
33     {
34         x=0,y=(1<<t);
35         for(int i=1;i<=n;i++)
36         {
37             tmp=g[i]&(1<<t);
38             if(!opt[i]) x&=tmp,y&=tmp;
39             else if(opt[i]&1) x|=tmp,y|=tmp;
40             else x^=tmp,y^=tmp;
41         }
42         if(x) {ans+=x;continue;}
43         if(y&&res+y<=m) ans+=y,res+=y;
44     }
45     printf("%d",ans);
46 }

原文地址:https://www.cnblogs.com/yyc-jack-0920/p/9734572.html

时间: 2024-10-15 06:20:02

10.1 模拟赛的相关文章

10.2模拟赛总结

10.2 模拟赛总结 T1. 数位dp: 一个非常非常非常非常显然的数位 DP \([L,R] = [1,R]-[1,L-1]\) 所以是分别求两次小于等于某个数字的方案数 \(f(i,j,k)\) 表示从低位数起的第 \(i\) 位,按照规则计算后答案为 \(j\quad (j=0,1)\) \(k\) 表示只考虑后面结尾和 \(lmt\)后面几位 的大小关系 \((k=0,1)\) 考虑第 \(i+1\) 位,算一下新构成的数字并判断下大小就可以了 注意到 \(L,R\) 数据范围特别大,需

10.22 模拟赛

10.22 模拟赛 T1 染色 考虑每个连通块删成一棵树就好了. mmp场上就我路径压缩写炸.... #include<iostream> #define MAXN 200006 using namespace std; int n , m; int fa[MAXN] , siz[MAXN] , book[MAXN] , sz[MAXN]; int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); } int main() {

10.31 模拟赛

10.31 模拟赛 A LIS 考虑每个数字前从 $ m $ 降序构造到 $ a_i $ 即可. #include <iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<vector> using namespace std; #define MAXN 300006 int n , m , k; int A[MAXN]; vector<int&g

10.5模拟赛

这么多模拟赛都没整理,能整理一天算一天吧qaq T1题面 sol:应该不难吧,分别对横坐标和纵坐标取差的绝对值,易知:如果互质就可以看到,否则就不行.然后出题人很毒瘤要用unsigned long long. #include <cstdio> #include <algorithm> using namespace std; long long x1,y1,x2,y2,c1=0,c2=0; unsigned long long x,y; unsigned long long AB

10 01模拟赛订正

好吧,这是我第一次写模拟赛的订正,主要是有时间而且这次的题确实好... 第一题确实好,用的算法人人都会,就是看你能不能想到,我考只打了O(n^4)的暴力,最后还苦逼的MLE,爆零了... 暴力就不多说了...枚举两个点更新其他的点... 其实我考场上思考的是,能被标记的点都与其他的点有什么联系,可惜,除了模拟题目的做法,就不会了... 那让我们就认真地思考一发:我们设A(x1,x2),B(x2,c2),C(x3,c3)来更新D点,只有:有两个点横坐标相等,有两个点纵坐标相等,才可以更新出来一个新

2019.10.24模拟赛赛后总结

本文原创,如果有不到位的地方欢迎通过右下角的按钮私信我! A.Icow Player 题目描述 被无止境的农活压榨得筋疲力尽后,Farmer John打算用他在MP3播放器市场新买的iCow来听些音乐,放松一下.FJ的iCow里存了N(1 <= N <= 1,000)首曲子,按1..N依次编号.至于曲子播放的顺序,则是按一个Farmer John自己设计的算法来决定: * 第i首曲子有一个初始权值R_i(1 <= R_i <= 10,000). * 当一首曲子播放完毕,接下来播放的

10.27 模拟赛

这一次终极被吊打 甚至没进前十 T2 最后改错 T3 没写正解 T1 elim 题目大意: n 行 m 列的游戏棋盘,一行或一列上有连续 三个或更多的相同颜色的棋子时,这些棋子都被消除 当有多处可以被消除时,这些地方的棋子将同时被消除 求消除后的棋盘 思路: sb模拟 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<cm

10.4 模拟赛

写在前面: 我发现我每一次写题解都是改题改不出来了QAQ 其实今天的题都还好啦. T1 可见点数 其实就是 luogu仪仗队 的数据扩大版,开个long long然后数组开大点就可以过了. T2 射击 这个题就很有意思了. 小W和他的东厂厂长叔叔去打窗户.... 其中两句话很有误导的含义,不少人都死在了这句话上面.[其实只有我 /滑稽 每秒只能彻底打破一扇窗户. 你不能要求他们叔侄两个打破不同的窗户获得的快乐值必须相同. 错误的贪心策略: 把所有的窗户按时间排序,时间相同按价值排序,然后模拟选择

17.2.10 NOIP模拟赛 藏妹子之处(excel)

藏妹子之处(excel) 问题描述: 今天CZY又找到了三个妹子,有着收藏爱好的他想要找三个地方将妹子们藏起来,将一片空地抽象成一个R行C列的表格,CZY要选出3个单元格.但要满足如下的两个条件: (1)任意两个单元格都不在同一行. (2)任意两个单元格都不在同一列. 选取格子存在一个花费,而这个花费是三个格子两两之间曼哈顿距离的和(如(x1,y1)和(x,y2)的曼哈顿距离为|x1-x2|+|y1-y2|).狗狗想知道的是,花费在minT到maxT之间的方案数有多少. 答案模100000000