A. Important Exam

水题

  1. #include<iostream>
  2. #include<string.h>
  3. #include<algorithm>
  4. #include<stdio.h>
  5. using namespace std;
  6. const int maxx = ;
  7. char a[maxx][maxx];
  8. int pre[maxx];
  9. int b[maxx];
  10. int main(){
  11. int n,m;
  12. while(~scanf("%d%d",&n,&m)){
  13. for (int i=;i<n;i++){
  14. scanf("%s",a[i]);
  15. }
  16. for (int i=;i<m;i++){
  17. scanf("%d",&b[i]);
  18. }
  19. for (int i=;i<m;i++){
  20. int sum[]={,,,,};
  21. for (int j=;j<n;j++){
  22. if (a[j][i]=='A'){
  23. sum[]++;
  24. }else if (a[j][i]=='B'){
  25. sum[]++;
  26. }else if (a[j][i]=='C'){
  27. sum[]++;
  28. }else if (a[j][i]=='D'){
  29. sum[]++;
  30. }else {
  31. sum[]++;
  32. }
  33. }
  34. int maxx=;
  35. for (int i=;i<=;i++){
  36. maxx=max(maxx,sum[i]);
  37. }
  38. pre[i]=maxx;
  39. }
  40. long long ans=;
  41. for (int i=;i<m;i++){
  42. ans+=(long long)pre[i]*b[i];
  43. }
  44. printf("%lld\n",ans);
  45. }
  46. return ;
  47. }

B. Zero Array

这道题就非常难受了

题意就是说,你有一个序列,你每次可以选择两个数,使得这两个数的值减小1。

最开始不知道为啥,脑子短路了,我发现只要把最大的减去最小的,然后用剩下的去减次小的,用剩下的继续减去

而且找不到反例,后面同学讨论一波,同学提出了一个2,2,2的样例,瞬间把我的结论推翻了。

后面也发现了我的结论的不正确,因为我每次把最大的减去次大的,那么不可避免的产生了一个新的数,这个数的大小我们没法判断,如果这个值过小,但是后面还有一个比这个值大的数。其实就不正确的。

其实你可以这样想,既然要求有没有可能,我们的顺序最优秀的,我们发现,其实每次把最高的降到次高的即可。这样我们保证一定是最有效的。但是有两个特殊情况,一个是数的总和是奇数那么无论怎么样

都会剩下一个。还有就是最高的太高了,用其他的所有都不能降到0,特判这两种情况即可

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. #define LL long long
  6. using namespace std;
  7. const int maxx = 1e5+;
  8. int a[maxx];
  9. LL sum;
  10. int main(){
  11. int n;
  12. while(~scanf("%d",&n)){
  13. sum=;
  14. for (int i=;i<=n;i++){
  15. scanf("%d",&a[i]);
  16. sum+=a[i];
  17. }
  18. sort(a+,a++n);
  19. if (sum%== && sum-a[n]>=a[n]){
  20. printf("YES\n");
  21. }else {
  22. printf("NO\n");
  23. }
  24. }
  25. return ;
  26. }

C. Maximum Median

每次对一个数+1,一共可以进行K次,问最大中位数是多少。

二分答案即可

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<algorithm>
  5. #include<vector>
  6. #define LL long long
  7. using namespace std;
  8. const int maxx = ;
  9. LL a[maxx];
  10. LL n,k;
  11. bool check(LL x){
  12. LL ans=;
  13. for (int i=(n+)/;i<=n;i++){
  14. if (a[i]<x){
  15. ans=(LL)ans+x-a[i];
  16. }
  17. }
  18. if (ans<=k)return true;
  19. else return false;
  20. }
  21. int main(){
  22. while(~scanf("%lld%lld",&n,&k)){
  23. for (int i=;i<=n;i++){
  24. scanf("%lld",&a[i]);
  25. }
  26. sort(a+,a++n);
  27. LL l=a[(n+)/],r=3e9;
  28. LL ans=l;
  29. while(l<=r){
  30. LL mid=(l+r)/;
  31. if (check(mid)){
  32. ans=mid;
  33. l=mid+;
  34. }else {
  35. r=mid-;
  36. }
  37. }
  38. printf("%lld\n",ans);
  39. }
  40. return ;
  41. }

D. Treasure Hunting

好题啊,这个题真的很秀,当时没看到这个题,后面看别人的代码+题解,懂了

题目意思是,给一些的坐标点,坐标点上会有宝藏,你可以在每一行中随意移动,并在指定的列中往下移动,问如何移动能收集所有的宝藏,同时使得移动的步数最少

你可以发现以下结论

1.我们在每一层搜集完了所有的宝藏后,应该尽快往下一层走。搜集完所有的时刻,一定是在某一个边界位置,可能是左边界,也有可能是右边界

2.我们每次下到新的一层,一定是从边界位置开始(因为那个时候刚好收集完成),向左走,找到最近的向下走的通道,或者向右走,找到最近向下走的通道

3.我们到达新的一层后,需要判断是否这一层有宝藏

4.如果有宝藏,我们需要考虑,是先往左走搜集完左边的,然后再向右走收集到最右边的,还是先向右走搜集完右边的,然后向左走搜集完最左边的

有了这个,我们的DP就非常好写了

转移方程为

dp[i][0]表示收集完第i层,最后在最左边

dp[i][1]表示收集完第i层,最后在最右边

用trans()计算从第j层边界到i层边界,水平移动的步数。

那么转移方程可以写为:

  1. dp[][]=abs(maxn[][]-)+abs(maxn[][]-maxn[][]);
  2. //从起点开始,走到最右边,再走回来
  3. dp[][]=abs(maxn[][]-);
  4. //从起点开始,走到最右边
  5. dp[i][]=min(dp[i][],dp[j][]+trans(j,,i,)+i-j);
  6. dp[i][]=min(dp[i][],dp[j][]+trans(j,,i,)+i-j);
  7. dp[i][]=min(dp[i][],dp[j][]+trans(j,,i,)+i-j);
  8. dp[i][]=min(dp[i][],dp[j][]+trans(j,,i,)+i-j);

前两个都是计算初始值

四个分别表示

从第j层左边界最后到第i层左边边界,搜集完第i层所需要的步数

从第j层左边界最后到第j层右边边界,搜集完第i层所需要的步数

从第j层右边界最后到第j层左边边界,搜集完第i层所需要的步数

从第j层右边界最后到第j层右边边界,搜集完第i层所需要的步数

最后在找边界的从左右两边找到最近的通道,用二分查找即可。

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<string.h>
  4. #include<stdio.h>
  5. #include<vector>
  6. #define LL long long
  7. #define rep(i,j,k) for(int i=j;i<=k;i++)
  8. #define per(i,j,k) for(int i=j;i>=k;i--)
  9. #define pb push_back
  10. #define pii pair<int,int>
  11. #define mp make_pair
  12. using namespace std;
  13. using namespace std;
  14. const int maxx = 2e5+;
  15. const int INF = 1e9;
  16. LL maxn[maxx][];
  17. LL dp[maxx][];
  18. int n,m,k,q;
  19. int b[maxx];
  20. LL trans(int u,int du,int v,int dv){
  21. int p=lower_bound(b+,b++q,maxn[u][du])-b;
  22. LL rt=INF;
  23. //找到第一个小于maxn[u][du]
  24. if(p<=q){
  25. rt=abs(maxn[u][du]-b[p])+abs(maxn[v][dv^]-b[p])+abs(maxn[v][dv]-maxn[v][dv^]);
  26. //我们找到abs(maxn[u][du]-b[p])+abs(maxn[v][dv^1]-b[p])+abs(maxn[v][dv]-maxn[v][dv^1])了一条路后,水平消耗的路程,应该是出发点的通路的距离,以及到达目的层后,目标方向的反向的最远距离,以及目标防方向的最远距离
  27. }
  28. p=upper_bound(b+,b++q,maxn[u][du])-b-;
  29. if(p){
  30. rt=min(rt,abs(maxn[u][du]-b[p])+abs(maxn[v][dv^]-b[p])+abs(maxn[v][dv]-maxn[v][dv^]));
  31. }
  32. return rt;
  33. }
  34. int main(){
  35. while(~scanf("%d%d%d%d",&n,&m,&k,&q)){
  36. rep(i,,n){
  37. maxn[i][]=INF;
  38. maxn[i][]=-INF;
  39. }
  40. LL x,y;
  41. rep(i,,k){
  42. scanf("%lld%lld",&x,&y);
  43. maxn[x][]=min(maxn[x][],y);
  44. maxn[x][]=max(maxn[x][],y);
  45. }
  46. maxn[][]=;
  47. maxn[][]=max(maxn[][],1LL);
  48. rep(i,,q){
  49. scanf("%d",&b[i]);
  50. }
  51. sort(b+,b++q);
  52. memset(dp,0x3f,sizeof(dp));
  53. dp[][]=abs(maxn[][]-)+abs(maxn[][]-maxn[][]);
  54. //从起点开始,走到最右边,再走回来
  55. dp[][]=abs(maxn[][]-);
  56. //从起点开始,走到最右边
  57. int j=;
  58. rep(i,,n){
  59. if (maxn[i][]==INF)continue;
  60. dp[i][]=min(dp[i][],dp[j][]+trans(j,,i,)+i-j);
  61. dp[i][]=min(dp[i][],dp[j][]+trans(j,,i,)+i-j);
  62. dp[i][]=min(dp[i][],dp[j][]+trans(j,,i,)+i-j);
  63. dp[i][]=min(dp[i][],dp[j][]+trans(j,,i,)+i-j);
  64. j=i;
  65. }
  66. printf("%lld\n",min(dp[j][],dp[j][]));
  67. }
  68. return ;
  69. }

Codeforces Round #577 (Div 2)的更多相关文章

  1. Codeforces Round #577 (Div. 2) D. Treasure Hunting

    Codeforces Round #577 (Div. 2)  D. Treasure Hunting 这个一场div2 前面三题特别简单,这个D题的dp还是比较难的,不过题目告诉你了只能往上走,所以 ...

  2. 矩阵拿宝物--Codeforces 1201D - Treasure Hunting Codeforces Round #577 (Div. 2)

    网上题解比较少,自己比较弱研究了半天(已经过了),希望对找题解的人有帮助 题目链接:https://codeforc.es/contest/1201/problem/D 题意: 给你一个矩形,起始点在 ...

  3. Codeforces Round #577 (Div. 2) 题解

    比赛链接:https://codeforc.es/contest/1201 A. Important Exam 题意:有\(n\)个人,每个人给出\(m\)个答案,每个答案都有一个分值\(a_i\), ...

  4. Codeforces Round #577 (Div. 2) C. Maximum Median (模拟,中位数)

    题意:给你一个长度为奇数\(n\)的序列.你可以对任意元素加上\(k\)次\(1\),求操作后的中位数最大. 题解:先对序列进行排序,然后对中位数相加,如果中位数和后面的元素相等,就对后面所有和当前中 ...

  5. Codeforces Round #577 (Div. 2) C. Maximum Median

    题意:就是给一n(奇数)个元素数组,可以对它的元素执行k次+1操作,递增排序,求中位数最大是多少. 那我们在排完序之后,中位数前的元素可以不管它,只要对中位数后的操作就行,我们要判断和中位数相等的元素 ...

  6. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  7. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  8. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  9. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

随机推荐

  1. 系统日志和内核消息 $ dmesg$ less /var/log/messages$ less /var/log/secure$ less /var/log/auth

    查看错误和警告消息,比如看看是不是很多关于连接数过多导致? 看看是否有硬件错误或文件系统错误? 分析是否能将这些错误事件和前面发现的疑点进行时间上的比对.

  2. ADSL pppoe 拔号工具rp-pppoe

    rp-pppoe 目前在各大发行版本都是存在的,比如Redhat/Fedora.红旗.Slackware.Debian.SuSE等系统,都是采用这个拔号软件,所以您大可不必为下载源码编译安装.只需要在 ...

  3. console.js还有浏览器不支持?

    今天看到项目中引入了一个插件,我超级惊讶 为什么引入console.js啊? 这个是插件的源码:https://github.com/yanhaijing/console.js 我搜到源作者对这个插件 ...

  4. 【python之路19】文件操作

    一.打开文件 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作. 打开文件的模式有: r ...

  5. Django与HTML业务基本结合--基本的用户名密码提交方法2

    from django.shortcuts import render # Create your views here. from django.shortcuts import render de ...

  6. Thinkphp 调试方法

    1.入口文件index.php配置APP_DEBUG,能直接发现页面上的错误 define('APP_DEBUG',True); 2.配置页面调试SHOW_PAGE_TRACE,可以在config里面 ...

  7. LintCode_173 链表插入排序

    题目 用插入排序对链表排序 样例 Given 1->3->2->0->null, return 0->1->2->3->null C++代码 ListN ...

  8. 【JZOJ3617】【ZJOI2014】力

    ╰( ̄▽ ̄)╭ 对于100%的数据,n≤100000;0<qi<1,000,000,000. (⊙ ▽ ⊙) 令ri=1i2, 设Fj=∑j−1i=0qi∗rj−1−i,Gj=∑j−1i= ...

  9. 【django后端分离】Django Rest Framework之认证系统之redis数据库的token认证(token过期时间)

    1:登录视图 redis_cli.py文件: import redis Pool= redis.ConnectionPool(host='localhost',port=6379,decode_res ...

  10. DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS

    原文:DirectX11笔记(五)--Direct3D渲染1--VERTICES AND INPUT LAYOUTS 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.c ...