题目:

1.刮刮卡

已知n(n<=1000000)张刮刮卡按顺序排列,刮开可以获得B元现金和B个积分,购买刮刮卡需要A元,某人若按照顺序刮开的话··当B的总和小于A时便会停止刮卡(即花出去的钱多余赢得的钱),现在我们可以将前k张按原来的顺序放到后面去···问k取多少时这个人可以获得多少积分?

2.矩阵

给出一个n行m阵的矩阵(n,m<=100),问如果从中选出K个互不重叠的非空子矩阵使得子矩阵的和最大

3.裁剪表格

给出n行m列的矩阵··(n,m<=1000)和q(q<=10000)次操作··每次操作交换两个互不重合的子矩阵···输出最后的矩阵

题解:

1.最大子串和

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e6+;
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
int num[N*],a[N],b[N*],n;
int main()
{
//freopen("rock.in","r",stdin);
//freopen("rock.out","w",stdout);
n=R();int ans=,sum1=,maxx=,sum2=;
for(int i=;i<=n;i++) b[i]=b[i+n]=R();
for(int i=;i<=n;i++) a[i]=R(),num[i]=num[i+n]=b[i]-a[i];
int Head=;
while(Head<=n)
{
if(num[Head]<) {Head++;continue;}
int Tail=Head;sum1=,sum2=;
while(Tail-Head+<=n)
{
sum1+=num[Tail];
sum2+=b[Tail];
if(sum2>maxx)
maxx=sum2,ans=Head-;
if(Tail-Head+<=n&&sum1+num[Tail+]>=)
Tail++;
else break;
}
Head=Tail+;
}
cout<<ans<<endl;
return ;
}

2.dp

用f[i][j][k]表示第一列取了前i个,第二列取了前j个且组成了k个子矩阵的最小值,具体转移方程看代码吧··

md考试时忘记初始化-inf了····下次一定要注意··

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
const int K=;
const long long inf=1e+;
int n,m,k,num[N],map[N][];
long long f1[N],sum[][N],temp[N],f2[N][N][K];
inline int R()
{
char c;int f=,i=;
for(c=getchar();(c<''||c>'')&&c!='-';c=getchar());
if(c=='-') i=-,c=getchar();
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f*i;
}
int main()
{
//freopen("matrix.in","r",stdin);
// freopen("matrix.out","w",stdout);
n=R(),m=R(),k=R();
if(m==)
{
for(int i=;i<=n;i++) num[i]=R();
memset(f1,-,sizeof(f1));
f1[]=;
for(int i=;i<=k;i++)
{
for(int j=i;j<=n;j++)
{
if(j==i) f1[j]=temp[j-]+num[j];
else f1[j]=max(f1[j-]+num[j],temp[j-]+num[j]);
}
for(int j=i;j<=n;j++)
{
if(j==i) temp[j]=f1[j];
else temp[j]=max(temp[j-],f1[j]);
}
}
long long ans=-inf;
for(int i=k;i<=n;i++) ans=max(ans,f1[i]);
cout<<ans<<endl;
}
else
{
memset(f2,-,sizeof(f2));
long long tot=;bool flag=true;
for(int i=;i<=n;i++)
for(int j=;j<=;j++)
{
map[i][j]=R();tot+=map[i][j];
if(map[i][j]<) flag=false;
sum[j][i]=sum[j][i-]+map[i][j];
}
if(flag)
{
cout<<tot<<endl;return ;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++) f2[i][j][]=;
for(int i=;i<=k;i++)
for(int j=;j<=n;j++) //第一列
for(int l=;l<=n;l++) //第二列
{
f2[j][l][i]=max(f2[j-][l][i],f2[j][l-][i]);
for(int p=;p<j;p++)
f2[j][l][i]=max(f2[j][l][i],f2[p][l][i-]+sum[][j]-sum[][p]);
for(int p=;p<l;p++)
f2[j][l][i]=max(f2[j][l][i],f2[j][p][i-]+sum[][l]-sum[][p]);
if(l==j)
for(int p=;p<j;p++)
f2[j][l][i]=max(f2[j][l][i],f2[p][p][i-]+sum[][l]-sum[][p]+sum[][j]-sum[][p]);
}
cout<<f2[n][n][k]<<endl;
}
return ;
}

3.链表

看了题解后发现链表是一个神奇的东西··另外也发现register配上for循环的优化效果的显著···

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=;
int n,m,q,pos[N][N],ri[N*N],down[N*N],val[N*N],tot;
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline int find(int x,int y)
{
int t=pos[][];
for(int i=;i<=x;i++)
t=down[t];
for(int i=;i<=y;i++)
t=ri[t];
return t;
}
int main()
{
//freopen("a.in","r",stdin);
n=R(),m=R(),q=R();
for(register int i=;i<=n;i++)
for(register int j=;j<=m;j++)
val[pos[i][j]=++tot]=R();
for(register int i=;i<=m+;i++)
pos[][i]=++tot,pos[n+][i]=++tot;
for(register int i=;i<=n;i++)
pos[i][]=++tot,pos[i][m+]=tot;
for(register int i=;i<=n;i++)
for(register int j=;j<=m;j++)
{
ri[pos[i][j]]=pos[i][j+];
down[pos[i][j]]=pos[i+][j];
}
while(q--)
{
int r1=R(),c1=R(),r2=R(),c2=R(),h=R(),w=R();
register int t1=find(r1-,c1-),t2=find(r2-,c2-),T1,T2,i;
for(T1=t1,T2=t2,i=;i<=h;i++)
swap(ri[T1=down[T1]],ri[T2=down[T2]]);
for(i=;i<=w;i++)
swap(down[T1=ri[T1]],down[T2=ri[T2]]);
for(T1=t1,T2=t2,i=;i<=w;i++)
swap(down[T1=ri[T1]],down[T2=ri[T2]]);
for(i=;i<=h;i++)
swap(ri[T1=down[T1]],ri[T2=down[T2]]);
}
int p=pos[][];
for(register int i=;i<=n;i++)
{
p=down[p];
for(register int j=,t=p;j<=m;j++)
cout<<val[t=ri[t]]<<" ";
cout<<endl;
}
return ;
}

NOIP2017赛前模拟(5):总结的更多相关文章

  1. NOIP2017赛前模拟(3):总结

    题目: 1.购买板凳(100) 大意:区间修改最后查询全局最大值; 2.新排序(40分暴力) 大意:给一串长度小于100000的数列···每次操作找出序列中严格小于其左边的数字或者严格大于其右边的数字 ...

  2. NOIP2017赛前模拟11月6日—7日总结

    收获颇丰的两天··· 题目1:序列操作 给定n个非负整数,进行m次操作,每次操作给出c,要求找出c个正整数数并将它们减去1,问最多能进行多少操作?n,m<=1000000 首先暴力贪心肯定是每次 ...

  3. NOIP2017赛前模拟11月4日总结:

    第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· ...

  4. NOIP2017赛前模拟11月2日总结

    分数爆炸的一天··但也学了很多 题目1:活动安排 给定n个活动的开始时间与结束时间··只有一个场地··要求保留尽量多的活动且时间不冲突···场地数n<=100000 考点:贪心 直接将结束时间按 ...

  5. NOIP2017赛前模拟10月30日总结

    题目1: n个人参赛(n<=100000),每个人有一个权值··已知两个人权值绝对值之差小于等于K时,两个人都有可能赢,若大于则权值大的人赢···比赛为淘汰制,进行n-1轮·问最后可能赢的人有多 ...

  6. NOIP2017赛前模拟(4):总结

    题目: 1.打牌 给定n个整数(n<=1000000),按照扑克牌对子(x,x)或者顺子(x,x+1,x+2)打出牌···问最多可以打出多少次对子或者顺子?牌的大小<=1000000 2. ...

  7. NOIP2017赛前模拟1:总结

    题目: 1.造盒子 题目描述 企鹅豆豆收到了面积为 K 的一块橡皮泥.但是他没有合适的盒子来装下这个橡皮泥.所以他打算造一个盒子. 制造台是有方形网格的平台,每个小正方形边长为 1 .现在豆豆有两类木 ...

  8. NOIP2017年11月9日赛前模拟

    最后一次NOIP模拟了····· 题目1:回文数字 Tom 最近在研究回文数字. 假设 s[i] 是长度为 i 的回文数个数(不含前导0),则对于给定的正整数 n 有:

  9. [NOIP2017]时间复杂度(模拟)

    sscanf读入数字,getline(cin,string)读一整行,其余暴力模拟即可. #include<cstdio> #include<string> #include& ...

随机推荐

  1. CF Gym 100637A Nano alarm-clocks

    题意:给你一些钟的时间,只可以往后调, 问最少调的时间总和是多少 题解:因为肯定是调到某个出现过时间的,只要枚举时间,在维护一个前缀和快速计算出时间总和就行了. #include<cstdio& ...

  2. CF #552 div3

    A - Restoring Three Numbers CodeForces - 1154A Polycarp has guessed three positive integers aa, bb a ...

  3. 扫雷游戏 NOIP(入门)

    题目描述: 扫雷游戏是一款十分经典的单机小游戏.它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷. 现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷 ...

  4. (72)zabbix监控日志文件 MySQL日志为例

    一般情况下,日志最先反映出应用当前的问题,在海量日志里面找到我们异常记录,然后记录下来,并且根据情况报警,大家可以监控系统日志.nginx.Apache.业务日志. 这边我拿常见的MySQL日志做监控 ...

  5. Yii2 AR模型搜索数据条数不对,AR模型默认去重

    最近在做Yii2的项目时, 发现了一个yii2 自带的Ar模型会自动对搜索出来的字段去重. 默认去重字段: id,  其他字段暂没发现 1. 例如: public function fields { ...

  6. java/jsp执行sql语句的方式

    首先给出sql驱动包 引入sql包 import java.sql.*;//java <%@ page import="java.sql.*"%>//jsp 连接mys ...

  7. 我的Python分析成长之路6

    模块:本质就是.py结尾的文件.从逻辑上组织python代码. 包: 本质就是一个目录,带有__init__.py文件,从逻辑上组织模块. 模块的分类: 1.标准库(内置的模块) 2.开源库(第三方库 ...

  8. Python9-进程理论-day35

    #!/usr/bin/env python# -*- coding:utf-8 -*-# Author:Tim'''进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源 ...

  9. 前端之bootstrap

    一.响应式介绍 众所周知,电脑.平板.手机的屏幕是差距很大的,假如在电脑上写好了一个页面,在电脑上看起来不错,但是如果放到手机上的话,那可能就会乱的一塌糊涂,这时候怎么解决呢?以前,可以再专门为手机定 ...

  10. hdu 5984

    PockyTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submissio ...