头更更大

这个10月完就要去搞NOIP了。。。

10月30天也就3次测试。。。为保佑进省一我还是每次测试玩都写个总结。。


。。↑↑↑首先有几个人发现并不只有三次测试。。。

boomshakalaka。。。第一题写炸。。。
第二题打没讨论全的Dp得了80分诶嘿嘿A_A
第三题一开始数据太水打模拟都能AC。。。然后凯爷当然厚道地改了数据。

是!的!我!没!图!了!

下面面详细解答:

T1 刮刮卡(50/100)————————

神秘代码:1997

problem

题意
类似于hdu”重温世界杯“,给你一堆卡,每张卡有A,B两个值,每次加上B值减去A值,当值为负时退出。可以把开头的几张牌按顺序挪到最后面。(1,2,3)->(3,1,2)问怎么挪可以保证拿到的B值的和最大。
样例数据

  • 输入 
    5
    4 6 2 8 4
    1 5 7 9 2

  • 输出
    4

solution

100%的正解用到了单调队列(然而我是滚动数组)
然后 莫名其妙地 暴成了50分。。。
一开始一直怀疑是评测机的问题。。。后来有人给我看了这个地方:

int pos(int x)
{if(x<=n)return x;else    return x-n;
}

然后我倒回去去看了我的滚动数组。。。

    int cnt=0;for(int i=1;i<=3*n;i++)//<=注意:是3n{jud+=c[pos(i)].b-c[pos(i)].a;tot+=c[pos(i)].b;cnt++;if(jud<0||cnt==n) {if(tot>ans){ans=tot;loc=dot;}jud=0;tot=0;dot=pos(i+1);cnt=0;}}

。。。才发现我爆炸的原因是。。。滚动数组没有用MOD。。。。。。
又一次以神奇的姿势(凯爷用语)神奇的GG了。orz

然而实际上还不用那么麻烦。因为花掉的钱的和等于用去的钱的和,所以总有一种方案我们可以拿到所有的积分。所以只需要找从哪里开始就行了。这里要用到前缀和。从终点,也就是从右往左扫前缀和找前缀和最大的那张牌就行。

章末附上正解代码。(滚动数组版)

T2 矩阵(80/100)————————

神秘代码:1998

problem

题意
 给一个N行M列的矩阵,挑出K个互不重叠的子矩阵,得分为这些子矩阵中的数值和,求这个数值的最大值。
 数据范围为:1<=N<=100,1<=M<=2,1<=K<=10,|数值|<=1000000;
样例数据

  • 输入
    3 2 2
    1 -3
    2 3
    -2 3

  • 输出
    9

solution

注意M的最大值仅为2。

40%的强行一位数组用 最大连续区间和 再用 s[i][j] 表示用了i个集合,尾数标号为j的最大区间和就行了。

80%的搞两个40%的算法(m=2嘛)再Dp判一下哪一列用几个区间。
数据略水,竟然给一个压根没讨论完情况的Dp这么多分??不过我收下了诶嘿嘿A_A

100%的有k x n^3的,有k x n^2的,还有k x n的。。。
感觉最后能打出k x n^3的就已经很不错了。。。
这里是这道题轮廓线Dp的代码。

T3 裁剪表格(80/100)————————

神秘代码:1999

problem

题意
给一个N*M的矩阵,每次交换两个形状完全相同的且互不重叠而且没有公共边界的子矩阵,输出最后结果。 (3秒)
样例数据

  • 输入 
    4 4 2
    1 1 2 2
    1 1 2 2
    3 3 4 4
    3 3 4 4
    1 1 3 3 2 2
    3 1 1 3 2 2

  • 输出
    4 4 3 3
    4 4 3 3
    2 2 1 1
    2 2 1 1

solution

事实上当时考试拿到卷子第一眼扫过去就认定了摔个模拟上去就走.
然后干完第二题后回来再看暴力。。。
嗯嗯嗯??有种可能AC的感觉怎么回事???

交完代码后:

AC了一道T3题,激动!

当然马上被凯爷改了数据就成这样了:(好像变化不大)

然后有一个大佬说在不开O2的情况下把所有for循环里的int改成register int会有神奇的效果。
改了之后:


还!有!什!么!能!阻!止!我!A ! C !

有!凯爷再改一次数据!

下面是 正!解!
正解更加玄学:链表结构!(凯爷链表大佬)

别告诉我你不知道什么是链表

从每一个点向它的下方和右方连接,然后转移时就直接往下数往右数再把边上的点的连接互换就行了。。。
好吧我这么说好像更不好解释了。。。。。。
看代码吧。。
友情链接

感想

现在才发现所谓的Dp转移方程不是推出来的而是背出来的。。
同一类的Dp题都有一定的套路。。。才知道啊智障
暴力大法好!
暴力大法好!!
暴力大法好!!!

代码

以后代码都放在章末。

T1

my/std.cpp

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}const int kkk=1000500;int n,f[kkk];
int ans=0,tot=0,jud=0,dot=0,loc=0;
struct node{int a,b;}c[kkk];int pos(int x)
{if(x<=n)return x;else    return x-n;
}int main()
{n=read();for(int i=1;i<=n;i++)c[i].b=read();for(int i=1;i<=n;i++)c[i].a=read();jud=0,ans=0,tot=0,dot=1,loc=0;int cnt=0;for(int i=1;i<=2*n;i++){jud+=c[pos(i)].b-c[pos(i)].a;tot+=c[pos(i)].b;cnt++;if(jud<0||cnt==n) {if(tot>ans){ans=tot;loc=dot;}jud=0;tot=0;dot=pos(i+1);cnt=0;}}ans=max(ans,tot);cout << loc-1 << endl;return 0;
}

T2

my.cpp

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}int n,m,o,a[105][3],f[4][105][105],sum[4][105][105];
int ans=0,flag=1;int main()
{n=read();   m=read();   o=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){a[i][j]=read(),ans+=a[i][j];if(a[i][j]<0)flag=0;}if(flag){cout<<ans<<endl;return 0;}memset(f,0,sizeof(f));  memset(sum,-63,sizeof(sum));    for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)f[1][i][j]=max(f[1][i][j-1],0)+a[j][1]; for(int i=1;i<=o;i++)for(int j=i;j<=n;j++)for(int k=i-1;k<=j-1;k++){sum[1][i][j] = max(sum[1][i][j],max(sum[1][i-1][k],0)+f[1][k+1][j]);ans = max(ans,sum[1][i][j]);sum[0][i][j] = max(ans,sum[0][i][j]);       }if(m>1){           for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)f[2][i][j]=max(f[2][i][j-1],0)+a[j][2]; for(int i=1;i<=o;i++)for(int j=i;j<=n;j++)for(int k=i-1;k<=j-1;k++){sum[2][i][j] = max(sum[2][i][j],max(sum[2][i-1][k],0)+f[2][k+1][j]);ans = max(ans,sum[2][i][j]);sum[0][i][j] = max(ans,sum[0][i][j]);           }           for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)f[3][i][j]=max(f[3][i][j-1],0)+a[j][1]+a[j][2]; for(int i=1;i<=o;i++)for(int j=i;j<=n;j++)for(int k=i-1;k<=j-1;k++){sum[3][i][j] = max(sum[3][i][j],max(sum[3][i-1][k],0)+f[3][k+1][j]);ans = max(ans,sum[3][i][j]);sum[0][i][j] = max(ans,sum[0][i][j]);           }       for(int i=1;i<=o;i++)for(int j=i;j<=n;j++)       for(int j1=i;j1<=j;j1++)            for(int j2=i;j2<=j;j2++)for(int g=0;g<=i;g++){sum[0][i][j] = max(sum[0][i][j],((g)?(sum[1][g][j1]):(0))+((i-g)?(sum[2][i-g][j2]):(0)));ans = max(ans,sum[0][i][j]);}       //      for(int i=1;i<=o;i++)
//      for(int j=i;j<=n;j++)
//      for(int k=i-1;k<=j-1;k++)
//      {//          if(sum[1][i][j]+sum[2][i][j]==sum[3][i][j])
//          sum[0][i][j]=max()
//      }}cout << ans << endl;return 0;
}

std.cpp

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}int n,m,o,a[105][3];
int ans=0,flag=1;int main()
{n=read();   m=read();   o=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){a[i][j]=read(),ans+=a[i][j];if(a[i][j]<0)flag=0;}if(flag){cout<<ans<<endl;return 0;}ans=-99999999;if(m==1){int f[105][105],sum[105][105];memset(f,0,sizeof(f));  memset(sum,-63,sizeof(sum));    for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)f[i][j]=max(f[i][j-1],0)+a[j][1];   for(int i=1;i<=o;i++)for(int j=i;j<=n;j++)for(int k=i-1;k<=j-1;k++){sum[i][j] = max(sum[i][j],max(sum[i-1][k],0)+f[k+1][j]);ans = max(ans,sum[i][j]);   }}else if(m>1){           int f[105][105][20],sum[105][3];memset(f,-10,sizeof(f));  for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)f[i][j][0]=0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)sum[i][j] += sum[i-1][j]+a[i][j];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)for(int k=1;k<=o;k++){f[i][j][k]=max(f[i-1][j][k],f[i][j-1][k]);for(int g=0;g<=i-1;g++)f[i][j][k]=max(f[i][j][k],f[g][j][k-1]+sum[i][1]-sum[g][1]);for(int g=0;g<=j-1;g++)f[i][j][k]=max(f[i][j][k],f[i][g][k-1]+sum[j][2]-sum[g][2]);if(i==j)for(int g=0;g<=j-1;g++) f[i][j][k]=max(f[i][j][k],f[g][g][k-1]+sum[i][1]-sum[g][1]+sum[j][2]-sum[g][2]);    }ans = max(ans,f[n][n][o]);}cout << ans << endl;return 0;
}

T3

my.cpp

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
using namespace std;inline int read()
{int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w;
}inline void write(int x)
{if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0');
}int n,m,q;
int pre,flag=1;
int r1,c1,r2,c2,h,w;
int mar[1005][1005];int main()
{n=read();   m=read();   q=read();for(register int i=1;i<=n;i++)  for(register int j=1;j<=m;j++){mar[i][j]=read();if(!pre)pre=mar[i][j];else if(mar[i][j]!=pre)flag=0;}while(q--){r1=read();c1=read();r2=read();c2=read();h=read();w=read();if(!flag){for(register int i=1;i<=h;i++)for(register int j=1;j<=w;j++){int k = mar[r1+i-1][c1+j-1];mar[r1+i-1][c1+j-1] = mar[r2+i-1][c2+j-1];mar[r2+i-1][c2+j-1] = k;}}}for(register int i=1;i<=n;i++){   for(register int j=1;j<=m;j++)cout<<mar[i][j]<<" ";cout<<endl;}return 0;
}

std.cpp

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define ll long long
using namespace std;int getint()
{int i=0,f=1;char c;for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());if(c=='-')f=-1,c=getchar();for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';return i*f;
}const int N=1005;
int n,m,Q,num;
int f[N*N][2],lab[N][N],v[N*N];int getlab(int a,int b)
{int p=lab[0][0];for(int i=1;i<=a;i++)p=f[p][1];for(int i=1;i<=b;i++)p=f[p][0];return p;
}int main()
{//freopen("table.in","r",stdin);//freopen("table.out","w",stdout);int a,b,c,d,h,w;n=getint(),m=getint(),Q=getint();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)v[lab[i][j]=++num]=getint();for(int i=0;i<=m+1;i++)lab[0][i]=++num,lab[n+1][i]=++num;for(int i=1;i<=n;i++)lab[i][0]=++num,lab[i][m+1]=++num;for(int i=0;i<=n;i++)for(int j=0;j<=m;j++){f[lab[i][j]][0]=lab[i][j+1];f[lab[i][j]][1]=lab[i+1][j];}while(Q--){a=getint(),b=getint(),c=getint(),d=getint(),h=getint(),w=getint();int p1=getlab(a-1,b-1),p2=getlab(c-1,d-1);int t1,t2,ww,hh;for(t1=p1,t2=p2,ww=1;ww<=w;ww++)swap(f[t1=f[t1][0]][1],f[t2=f[t2][0]][1]);for(hh=1;hh<=h;hh++)swap(f[t1=f[t1][1]][0],f[t2=f[t2][1]][0]);for(t1=p1,t2=p2,hh=1;hh<=h;hh++)swap(f[t1=f[t1][1]][0],f[t2=f[t2][1]][0]);for(ww=1;ww<=w;ww++)swap(f[t1=f[t1][0]][1],f[t2=f[t2][0]][1]);}for(int i=1,p=lab[0][0];i<=n;i++){for(int j=1,t=p=f[p][1];j<=m;j++)cout<<v[t=f[t][0]]<<" ";cout<<endl;}return 0;
}

*TEST 10 for NOIP 迷幻测试 (230/300)相关推荐

  1. 小米usb测试软件,你还在用USB传文件?小米10系列USB详细测试——《小米10十大槽点》番外 图文版...

    你还在用USB传文件?小米10系列USB详细测试--<小米10十大槽点>番外 图文版 2020-06-13 22:03:29 1点赞 1收藏 0评论 创作立场声明:给大家科普一下传文件的技 ...

  2. 10款存储设备测试软件

    http://www.dostor.com/article/2014-01-18/7180637.shtml [导读]随着云存储.大数据的持续升温,存储的地位也水涨船高,存储设备的性能也越来越重要.存 ...

  3. 如何在Windows 10中设置和测试麦克风

    Whether you're dictating with speech recognition or talking to a family member or gaming buddy over ...

  4. 苹果手机可以测试Android,苹果手机可以运行Android 10,只能简单测试,会开启新时代吗...

    原标题:苹果手机可以运行Android 10,只能简单测试,会开启新时代吗 如果要将手机分类的话,可以有多种分类方法,从手机厂商发源地分的话,可以分为国内手机(小米.OPPO.vivo以及华为等)和国 ...

  5. 陪学读书会——《点石成金》第九章-1天10美分的可用性测试(三)

    2018年,我们推出陪学读书会,一个专属于产品经理的读书会. 每月我们为您精读一本书,一个月后我们会举办一次书友读书分享会.希望我们能够一起多读书,读好书! 陪学读书会--<点石成金>第九 ...

  6. NOIP模拟测试10「大佬·辣鸡·模板」

    大佬 显然假期望 我奇思妙想出了一个式子$f[i]=f[i-1]+\sum\limits_{j=1}^{j<=m} C_{k \times j}^{k}\times w[j]$ 然后一想不对得容 ...

  7. 8.10 NOIP模拟测试16 Blue+Weed+Drink

    T1 Blue 贪心,每次跳得时候跳能跳到的最远的地方,跳过的就把他设为0,每次二分找到位置,一直跳就行,如果能跳到的位置就是当前位置或比当前位置还小(数组里现在呆着的这一块石头,二分得到的就是当前位 ...

  8. [NOIP模拟测试10]辣鸡(ljh) 题解

    首先计算块内贡献,很显然是$(x_2-x_1)*(y_2-y_1)*2$. 然后考虑矩形之间的贡献,sort一遍分类讨论$n^2$暴力即可. 注意考虑边界情况是否能多两个,以及角对角的情况. 另外,排 ...

  9. 2019.8.10 NOIP模拟测试16 反思总结【基本更新完毕忽视咕咕咕】

    一如既往先放代码,我还没开始改- 改完T1滚过来了,先把T1T2的题解写了[颓博客啊] 今天下午就要走了,没想到还有送行的饯别礼,真是欣喜万分[并没有] 早上刚码完前面的总结,带着不怎么有希望的心情开 ...

  10. c++ dll继续使用然后强制删除dll文件_Windows 10系统安全风险,近300个系统执行文件容易遭受劫持攻击...

    一个简单的VBScript足以让用户获得管理权限并完全绕过Windows 10上的UAC. 在普华永道英国安全研究人员Wietze Beukema的最新报告中,我们了解到将近300个Windows 1 ...

最新文章

  1. 如何用sysbench做好IO性能测试
  2. Java状态模式实现工作流_关于使用“状态模式”做工作流概要。
  3. 关闭Outlook自动完成功能
  4. mysql sql应用_MySQL数据库应用(5)SQL语言(2)
  5. 3.Excel数据透视表
  6. 2015/12/15--Document对象
  7. 如何用Camtasia进行内容补充?
  8. 体检结果(2018年10月,胃肠镜)
  9. GridView中如何取得隐藏列的值
  10. 如何使用NFC双界面读写器UTrust4701读取电子护照信息
  11. 在线URLEncode编码,URLDecode解码工具
  12. 下一个十年,游戏在可玩性上会有什么样的发展?
  13. MongoDB分片机制
  14. c语言char10是什么意思,c语言char是什么意思
  15. 转载 GIS地图知识
  16. 基于Java毕业设计校园社团管理平台演示录像2021源码+系统+mysql+lw文档+部署软件
  17. 华中科技大学组原实验记录 运算器ALU实验
  18. 阿里巴巴python招聘_作为应届生,我在阿里巴巴的成功面试经历!
  19. 鸿蒙系统的软件怎么下载,怎么下载鸿蒙系统?
  20. 微软员工揭秘 Linux 子系统研发全过程

热门文章

  1. Python实战回归模型-消费者人群画像-信用智能评分(基于中国移动用户数据)
  2. Windows驱动程序开发 - 初识驱动
  3. html文本框换行,JS文本框的换行
  4. How to change the implementation (detour) of an externally declared function
  5. 20191009 csp-s模拟T3(并查集)
  6. Java程序员必读书籍推荐
  7. linux网络编程之shutdown() 与 close()函数详解
  8. Payton猜词游戏
  9. 05 Python基础
  10. 关于“DEP数据执行保护”的解决方案