1. /*
  2. 今天的题目还是比较不错的.
  3. 今天考的很烂还是依旧的弱.
  4. 快考试了加油吧.
  5. Bless all.
  6. */
  1. 注:所有题目的时间限制均为 1s,内存限制均为 256MB
  2. 1.第K小数 (number.cpp/c/pas)
  3. 【问题描述】
  4. 有两个正整数数列,元素个数分别为NM。从两个数列中分别任取一个数 相乘,这样一共可以得到N*M个数,询问这N*M个数中第K小数是多少。
  5. 【输入格式】
  6. 输入文件名为number.in
  7. 输入文件包含三行。
  8. 第一行为三个正整数N,MK
  9. 第二行为N个正整数,表示第一个数列。
  10. 第三行为M个正整数,表述第二个数列。
  11. 【输出格式】
  12. 输出文件名为number.out
  13. 输出文件包含一行,一个正整数表示第K小数。
  14. 【输入输出样例1
  15. number.in
  16. 2 3 4
  17. 1 2
  18. 2 1 3
  19. number.out
  20. 3
  21. 【输入输出样例2
  22. number.in
  23. 5 5 18
  24. 7 2 3 5 8
  25. 3 1 3 2 5
  26. number.out
  27. 16
  28. 【数据规模与约定】
  29. ![这里写图片描述](https://img-blog.csdn.net/20161110205658499)
  30. ![这里写图片描述](https://img-blog.csdn.net/20161110205712476)
  1. /*
  2. 二分答案.
  3. O((n+m)logk).
  4. 然而本蒟蒻一开始只能暴力.
  5. 其实一开始也想到这个单调性了.
  6. 但想了想ans并不单调啊.
  7. 然后就跪了orz.
  8. 二分找下界.
  9. 检验的时候因为确定了一个序列之后
  10. 另一个序列的元素就单调了.
  11. so 我们二分一个答案
  12. 就可以计算出比它小的数的个数.
  13. 这个显然是单调的.
  14. */
  15. #include<iostream>
  16. #include<cstdio>
  17. #include<algorithm>
  18. #define MAXM 25000001
  19. #define MAXN 200001
  20. #define LL long long
  21. using namespace std;
  22. LL n,m,k;
  23. LL a[MAXN],b[MAXN],tot,ans;
  24. LL read()
  25. {
  26. LL x=0,f=1;char ch=getchar();
  27. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  28. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  29. return x*f;
  30. }
  31. bool check(LL x)
  32. {
  33. int p=m;tot=0;
  34. for(int i=1;i<=n;i++)
  35. {
  36. while(p&&a[i]*b[p]>=x) p--;
  37. tot+=p;
  38. }
  39. if(tot>=k) return true;
  40. return false;
  41. }
  42. inline void erfen(LL l,LL r)
  43. {
  44. LL mid;
  45. while(l+1<r)
  46. {
  47. mid=(l+r)>>1;
  48. if(check(mid)) ans=mid,r=mid;
  49. else l=mid;
  50. }
  51. cout<<l;
  52. }
  53. int main()
  54. {
  55. freopen("number.in","r",stdin);
  56. freopen("number.out","w",stdout);
  57. n=read(),m=read(),k=read();
  58. for(int i=1;i<=n;i++) a[i]=read();
  59. for(int i=1;i<=m;i++) b[i]=read();
  60. sort(a+1,a+n+1),sort(b+1,b+m+1);
  61. erfen(0,a[n]*b[m]);
  62. return 0;
  63. }

2. dwarf tower (dwarf.cpp/c/pas)

【问题描述】

Vasya在玩一个叫做”Dwarf Tower”的游戏,这个游戏中有n个不同的物品, 它们的编号为1到n。现在Vasya想得到编号为1的物品。 获得一个物品有两种方式:

1. 直接购买该物品,第i件物品花费的钱为ci

2. 用两件其他物品合成所需的物品,一共有m种合成方式。

请帮助Vasya用最少的钱获得编号为1的物品。

【输入格式】

第一行有两个整数n,m(1<=n<=10000,0<=m<=100000),分别表示有n种物品以 及m种合成方式。

接下来一行有n个整数,第i个整数ci表示第i个物品的购买价格,其中 0<=ci<=10^9。

接下来m行,每行3个整数ai,xi,yi,表示用物品xi和yi可以合成物品ai,其 中(1<=ai,xi,yi<=n; ai<>xi, xi<>yi, yi<>ai)

【输出格式】

一行,一个整数表示获取物品 1 的最少花费。

输入样例:

5 3

5 0 1 2 5

5 2 3

4 2 3

1 4 5

输出样例:

2

【数据规模与约定】

60%的数据, n<=100

100%的数据, n<=10000, m<=100000

  1. /*
  2. 75.
  3. 愚蠢的我建了一棵树.
  4. 还能自动判环2333.
  5. 但不知道为什么会W.
  6. 望路过大神指教.
  7. */
  8. #include<iostream>
  9. #include<cstdio>
  10. #include<vector>
  11. #define MAXN 10001
  12. using namespace std;
  13. int w[MAXN],n,m,f[MAXN];
  14. vector<int>son[MAXN];
  15. inline int read()
  16. {
  17. int x=0,f=1;char ch=getchar();
  18. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  19. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  20. return x*f;
  21. }
  22. inline int slove(int u)
  23. {
  24. if(f[u]) return f[u];
  25. f[u]=w[u];
  26. for(int i=0;i<son[u].size();i+=2)
  27. f[u]=min(w[u],slove(son[u][i])+slove(son[u][i+1]));
  28. return f[u];
  29. }
  30. int main()
  31. {
  32. freopen("dwarf.in","r",stdin);
  33. freopen("dwarf.out","w",stdout);
  34. int x,y,z;
  35. n=read(),m=read();
  36. for(int i=1;i<=n;i++) w[i]=read();
  37. if(!m)
  38. {
  39. printf("%d",w[1]);
  40. return 0;
  41. }
  42. for(int i=1;i<=m;i++)
  43. {
  44. x=read(),y=read(),z=read();
  45. son[x].push_back(y),son[x].push_back(z);
  46. }
  47. cout<<slove(1);
  48. return 0;
  49. }
  1. /*
  2. spfa松弛.
  3. 一开始也想这样做来着.
  4. 但是建图的时候傻眼了.
  5. 其实三个点的话就那两个点作为(u,v).
  6. 另一个点辅助更新就好了.
  7. 一开始让所有点都入队
  8. 是为了保证能够正确松弛.
  9. */
  10. #include<iostream>
  11. #include<cstdio>
  12. #include<queue>
  13. #define MAXN 10001
  14. using namespace std;
  15. int n,m,dis[MAXN],head[MAXN],cut;
  16. bool b[MAXN];
  17. queue<int>q;
  18. struct data{int v,next,x;}e[MAXN*20];
  19. inline int read()
  20. {
  21. int x=0,f=1;char ch=getchar();
  22. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  23. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  24. return x*f;
  25. }
  26. inline void add(int v,int u,int x)
  27. {
  28. e[++cut].v=v;
  29. e[cut].next=head[u];
  30. e[cut].x=x;
  31. head[u]=cut;
  32. }
  33. inline void bfs()
  34. {
  35. int u;
  36. for(int i=1;i<=n;i++) b[i]=true;
  37. while(!q.empty())
  38. {
  39. u=q.front();q.pop();b[u]=false;
  40. for(int i=head[u];i;i=e[i].next)
  41. {
  42. int v=e[i].v,x=e[i].x;
  43. if(dis[v]>dis[x]+dis[u])
  44. {
  45. dis[v]=dis[x]+dis[u];
  46. if(!b[v]) b[v]=true,q.push(v);
  47. }
  48. }
  49. }
  50. }
  51. int main()
  52. {
  53. freopen("dwarf.in","r",stdin);
  54. freopen("dwarf.out","w",stdout);
  55. int x,y,z;
  56. n=read(),m=read();
  57. for(int i=1;i<=n;i++) dis[i]=read(),q.push(i);
  58. if(!m)
  59. {
  60. printf("%d",dis[1]);
  61. return 0;
  62. }
  63. for(int i=1;i<=m;i++)
  64. {
  65. x=read(),y=read(),z=read();
  66. add(x,y,z),add(x,z,y);
  67. }
  68. bfs();
  69. printf("%d",dis[1]);
  70. return 0;
  71. }

3. abcd (abcd.cpp/c/pas)

【问题描述】

有4个长度为N的数组a,b,c,d。现在需要你选择N个数构成数组e,数组e满足 a[i]≤e[i]≤b[i]以及

并且使得最大。

【输入格式】

输入文件名为abcd.in。

输入文件共 N+1 行。

第 1 行包含1个正整数N。

第 i+1 行包含4个整数a[i],b[i],c[i],d[i]。

【输出格式】

输出文件名为abcd.out。

输出共1行,包含1个整数,表示所给出公式的最大值。

输入数据保证一定有 解。

【输入输出样例1】

abcd.in

5

- 1 1 2 5

-2 2 1 2

0 1 1 3

-2 -1 3 10

-2 2 3 9

abcd.out

2

【输入输出样例2】

abcd.in

10

1 10 1 7

-10 10 2 0

-10 10 2 2

-10 10 2 0

1 10 1 0

-10 10 2 0

10 10 2 0

1 10 1 0

-10 10 2 0

1 10 1 0

abcd.out

90

【输入输出样例3】

abcd.in

10

1 10 1 0

-10 10 2 2

-10 10 2 2

-10 10 2 2

1 10 1 0

-10 10 2 2

-10 10 2 2

1 10 1 0

-10 10 2 2

1 10 1 0

abcd.out

-4

【数据规模与约定】

对于 20%的数据, N≤10, -2≤a[i]

  1. /*
  2. 20.
  3. 纯暴力(剪枝忽视掉).
  4. */
  5. #include<iostream>
  6. #include<cstdio>
  7. #include<cstdlib>
  8. #include<ctime>
  9. #define MAXN 201
  10. using namespace std;
  11. int a[MAXN],b[MAXN],c[MAXN],d[MAXN],n,ans=-1e9,tot,s[MAXN];
  12. int sum1[MAXN],sum2[MAXN];
  13. inline int read()
  14. {
  15. int x=0,f=1;char ch=getchar();
  16. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  17. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  18. return x*f;
  19. }
  20. inline void dfs(int t,int tot,int sum)
  21. {
  22. if(t==n+1)
  23. {
  24. if(!tot)
  25. ans=max(ans,sum);
  26. return ;
  27. }
  28. for(int i=b[t];i>=a[t];i--)
  29. {
  30. if(tot+i*c[t]+sum1[t+1]<0) continue;
  31. dfs(t+1,tot+i*c[t],sum+i*d[t]);
  32. }
  33. return ;
  34. }
  35. int main()
  36. {
  37. freopen("abcd.in","r",stdin);
  38. freopen("abcd.out","w",stdout);
  39. n=read();
  40. for(int i=1;i<=n;i++)
  41. a[i]=read(),b[i]=read(),c[i]=read(),d[i]=read();
  42. for(int i=n;i>=1;i--) sum1[i]=sum1[i+1]+b[i]*c[i];
  43. dfs(1,0,0);
  44. printf("%d",ans);
  45. return 0;
  46. }
  1. /*
  2. 60.
  3. f[i][y]表示从n到i构成y的最大值.
  4. 从1点跑固定终点的单源DAG.
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<cstring>
  9. #include<cstdlib>
  10. #include<ctime>
  11. #define MAXN 202
  12. #define MAXM 100001
  13. using namespace std;
  14. int a[MAXN],b[MAXN],c[MAXN],d[MAXN],n,tot;
  15. int sum1[MAXN],sum2[MAXN],f[MAXN][MAXM*2+100],INF;
  16. inline int read()
  17. {
  18. int x=0,f=1;char ch=getchar();
  19. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  20. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  21. return x*f;
  22. }
  23. inline int dfs(int t,int tot)
  24. {
  25. if(f[t][tot]!=INF) return f[t][tot];
  26. if(t==n+1)
  27. {
  28. if(tot==MAXM-1) return 0;
  29. return INF;
  30. }
  31. for(int i=b[t];i>=a[t];i--)
  32. {
  33. //if(tot+i*c[t]+sum1[t+1]<0) continue;
  34. f[t][tot]=max(f[t][tot],dfs(t+1,tot+i*c[t])+i*d[t]);
  35. }
  36. return f[t][tot];
  37. }
  38. int main()
  39. {
  40. freopen("abcd.in","r",stdin);
  41. freopen("abcd.out","w",stdout);
  42. memset(f,-127/3,sizeof f);INF=f[0][0];
  43. n=read();
  44. for(int i=1;i<=n;i++)
  45. a[i]=read(),b[i]=read(),c[i]=read(),d[i]=read();
  46. //for(int i=n;i>=1;i--) sum1[i]=sum1[i+1]+b[i]*c[i];
  47. printf("%d",dfs(1,MAXM-1));
  48. return 0;
  49. }
  1. /*
  2. 正解多重背包.
  3. 想不到吖想不到.
  4. 对于∑e[i]*c[i]=0 ①
  5. 和ans=∑b[i]*e[i] ②
  6. 因为e[i]=[a[i],b[i]]等价于[0,b[i]-a[i]]+a[i];
  7. so 问题转化为使得
  8. ∑(b[i]-a[i])*c[i]+∑a[i]*c[i]=0
  9. 且∑(b[i]-a[i])*d[i]+∑a[i]*d[i]最大.
  10. 然后∑a[i]*c[i]和∑a[i]*d[i]是可以计算的.
  11. 令V=∑a[i]*c[i](V<0),s[i]=b[i]-a[i].
  12. so 问题转化为在体积为-V的背包中取物品s[i]求最大值.
  13. 可以从1(or n)跑固定起点和终点的DAG
  14. or二进制拆01背包or四边形单调队列等等...
  15. */
  16. #include<iostream>
  17. #include<cstdio>
  18. #include<cstring>
  19. #define MAXN 201
  20. #define MAXM 100001
  21. using namespace std;
  22. int n,a[MAXN],b[MAXN],c[MAXN],d[MAXN];
  23. int V,ans1,tot,w[MAXM],v[MAXM],f[MAXM];
  24. inline int read()
  25. {
  26. int x=0,f=1;char ch=getchar();
  27. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  28. while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
  29. return x*f;
  30. }
  31. inline int slove()
  32. {
  33. V*=-1;
  34. for(int i=1;i<=n;i++)
  35. {
  36. for(int j=1;j<=b[i];j<<=1)
  37. b[i]-=j,w[++tot]=d[i]*j,v[tot]=c[i]*j;
  38. if(b[i]) w[++tot]=d[i]*b[i],v[tot]=c[i]*b[i];
  39. }
  40. f[0]=0;
  41. for(int i=1;i<=tot;i++)
  42. for(int j=V;j>=v[i];j--)
  43. f[j]=max(f[j],f[j-v[i]]+w[i]);
  44. return f[V];
  45. }
  46. int main()
  47. {
  48. freopen("abcd.in","r",stdin);
  49. freopen("abcd.out","w",stdout);
  50. n=read();memset(f,-127/3,sizeof f);
  51. for(int i=1;i<=n;i++)
  52. a[i]=read(),b[i]=read(),c[i]=read(),d[i]=read(),
  53. V+=a[i]*c[i],b[i]-=a[i],ans1+=a[i]*d[i];
  54. printf("%d",slove()+ans1);
  55. return 0;
  56. }

Qbxt 模拟赛&&day-8的更多相关文章

  1. QBXT模拟赛2

    总结 期望得分:\(100 + 40 + 0 = 140\) 实际得分:\(0 + 0 + 0 = 0\) 鬼知道为什么我代码没有交上..自测\(10 + 50 + 0\)--这是心态爆炸的一场考试 ...

  2. QBXT模拟赛1

    总结 期望得分:\(100 + 80 + 10 = 190\) 实际得分:\(90 + 80 + 10 = 180\) 这是在清北的第一场考试,也是在清北考的最高的一次了吧..本来以为能拿\(190\ ...

  3. 4.28 QBXT模拟赛

    NOIP2016提高组模拟赛 ——By wangyurzee7 中文题目名称 迷妹 膜拜 换数游戏 英文题目与子目录名 fans mod game 可执行文件名 fans mod game 输入文件名 ...

  4. 2017.10.3 QBXT 模拟赛

    题目链接 T1 模拟 #include <cstring> #include <cstdio> #define N 105000 int L,R; char s[N]; int ...

  5. 2017.10.7 QBXT 模拟赛

    题目链接 T1 容斥原理,根据奇偶性进行加减 #include<iostream> #include<cstdio> using namespace std; typedef ...

  6. 2017.10.6 QBXT 模拟赛

    题目链接 T1 Sort 一下与原数组比较 ,若有两个数或者没有数发生位置交换 ,则输出YES ,否则输出NO #include <algorithm> #include <ccty ...

  7. 2017.10.5 QBXT 模拟赛

    题目链接 T1 从小到大排序,用sum记录前缀和,然后枚举1~n个数 ,如果当前的前缀和 + 1小于a[i]的话 那么 sum + 1永远不可能拼出来 直接输出sum + 1 ,否则统计前缀和.最后如 ...

  8. 2017.10.4 QBXT 模拟赛

    题目链接 T1 维护一个单调栈 #include <iostream> #include <cstdio> #define N 500000 #define rep(a,b,c ...

  9. 2017.10.2 QBXT 模拟赛

    题目链接 T1 我们所要求得是(a*b)|x 也就是 使(a*b)的倍数小于x的个数之和 1<=x<=n 我们可以 找一个c使得 (a*b*c)<=x 由于我们所求的是一个三元有序对 ...

  10. 2017.10.1 QBXT 模拟赛

    题目链接 T1 枚举右端点,前缀和优化.对于当前点x,答案为 sum[x][r]-sum[x][l-1]-(sum[z][r]-sum[z][l-1]) 整理为 sum[x][r]-sum[z][r] ...

随机推荐

  1. Elasticsearch多集群数据同步

    有时多个Elasticsearch集群避免不了要同步数据,网上查找了下数据同步工具还挺多,比较常用的有:elasticserach-dump.elasticsearch-exporter.logsta ...

  2. Jmeter之梯度式加压(Stepping Thread Group)

    1.添加线程组(Stepping Thread Group) 2.设置数据 学习参考网址:https://www.cnblogs.com/imyalost/p/7658816.html   这个大大的 ...

  3. 并不对劲的P5589

    题目大意 有\(n\)(\(n\leq 10^9\))个数:\(1,2,...,n\),每次操作是随机取一个没被删除的数\(x\),并删去\(x,x^2,x^3,...\). 求期望几次删完所有数. ...

  4. Neo4j Cypher语法(三)

    目录 5 函数 5.1 谓词函数 5.2 标量函数 5.3 聚合函数 5.4 列表函数 5.5 数学函数 5.6 字符串函数 5.7 Udf与用户自定义函数 6 模式 6.1 索引 6.2 限制 7 ...

  5. jenkins 设置中文显示

    这里使用的方法是安装中文语言包,安装的插件名称是:Localization: Chinese (Simplified) 1.在插件管理,搜索 Localization: Chinese (Simpli ...

  6. linux查询cpu过高原因--java

    1. 查询java pid top -c 2. 查询java进程下,线程情况 top -Hp pid(threadIdList) 3. 将10进制线程id转为16进制 printf "%x ...

  7. golang(9):网络编程 & redis

    网络编程 TCP/IP 协议: . TCP(传输控制协议) -- 应用程序之间通信 . UDP(用户数据包协议)-- 应用程序之间的简单通信 . IP(网际协议) -- 计算机之间的通信 . DHCP ...

  8. kali入侵服务器的那一套实战

    dnsenum  -enum       xxxxx.com 枚举出网站的所有域名和服务器的ip地址 打开百度查询ip地址的所在地 whatweb xxxx.com 查看那些网站入口可以访问   以状 ...

  9. form表单相关

    <input> 元素 <input> 元素是最重要的表单元素. <input> 元素有很多形态,根据不同的 type 属性. 这是本章中使用的类型: 类型 描述 t ...

  10. CSS 使用calc()获取当前可视屏幕高度

    来自:https://blog.csdn.net/qq_32063079/article/details/89766442 先了解一下CSS3的相对长度单位(参考详细教程) : 相对长度单位指定了一个 ...