NOIP2017赛前模拟(5):总结
题目:
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):总结的更多相关文章
- NOIP2017赛前模拟(3):总结
题目: 1.购买板凳(100) 大意:区间修改最后查询全局最大值; 2.新排序(40分暴力) 大意:给一串长度小于100000的数列···每次操作找出序列中严格小于其左边的数字或者严格大于其右边的数字 ...
- NOIP2017赛前模拟11月6日—7日总结
收获颇丰的两天··· 题目1:序列操作 给定n个非负整数,进行m次操作,每次操作给出c,要求找出c个正整数数并将它们减去1,问最多能进行多少操作?n,m<=1000000 首先暴力贪心肯定是每次 ...
- NOIP2017赛前模拟11月4日总结:
第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· ...
- NOIP2017赛前模拟11月2日总结
分数爆炸的一天··但也学了很多 题目1:活动安排 给定n个活动的开始时间与结束时间··只有一个场地··要求保留尽量多的活动且时间不冲突···场地数n<=100000 考点:贪心 直接将结束时间按 ...
- NOIP2017赛前模拟10月30日总结
题目1: n个人参赛(n<=100000),每个人有一个权值··已知两个人权值绝对值之差小于等于K时,两个人都有可能赢,若大于则权值大的人赢···比赛为淘汰制,进行n-1轮·问最后可能赢的人有多 ...
- NOIP2017赛前模拟(4):总结
题目: 1.打牌 给定n个整数(n<=1000000),按照扑克牌对子(x,x)或者顺子(x,x+1,x+2)打出牌···问最多可以打出多少次对子或者顺子?牌的大小<=1000000 2. ...
- NOIP2017赛前模拟1:总结
题目: 1.造盒子 题目描述 企鹅豆豆收到了面积为 K 的一块橡皮泥.但是他没有合适的盒子来装下这个橡皮泥.所以他打算造一个盒子. 制造台是有方形网格的平台,每个小正方形边长为 1 .现在豆豆有两类木 ...
- NOIP2017年11月9日赛前模拟
最后一次NOIP模拟了····· 题目1:回文数字 Tom 最近在研究回文数字. 假设 s[i] 是长度为 i 的回文数个数(不含前导0),则对于给定的正整数 n 有:
- [NOIP2017]时间复杂度(模拟)
sscanf读入数字,getline(cin,string)读一整行,其余暴力模拟即可. #include<cstdio> #include<string> #include& ...
随机推荐
- MySQL 外键 表的查询
自增补充 这是查看怎么创建的表, \G示旋转90度显示表的内容 表的自增的关键是** AUTO_INCREMENT=3**,在表中添加数据后,这个会自动改变,通过alert可以改变这个默认值 mysq ...
- 用户输入和while循环
函数input()的工作原理 message=input('Tell me something,and I will repeat it back to you:') print(message) 编 ...
- Python——print用法详解
1.print语法格式 print()函数具有丰富的功能,详细语法格式如下:print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=Fa ...
- Java中this关键字的用法
this关键字作用: 1. 如果存在同名成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据. 2. 在一个构造函数中可以调用另外一个构造函数初始化对 ...
- d3网址
官网: http://d3js.com D3创始人 http://bost.ocks.org.mike 教程: http://www.dashingd3js.com/table-of-contents ...
- Angular - Can't bind to 'ngModel' since it isn't a known property of 'input'.
用[(ngModel)]="xxx"双向绑定,如:控制台报错:Can't bind to 'ngModel' since it isn't a known property of ...
- NodeJS基础API-path相关的问题basename,extname,dirname,parse,format,sep,delimiter,win32,posix
path 参考文档:http://nodejs.cn/api/path.html const {normalize} = require('path'); // ES6语法 // 相当于 const ...
- Java-JFrame窗体美化
Java-JFrame窗体美化 JFrame默认的窗体比较土,可以通过一定的美化,让窗体表现的比较漂亮,具体要根据设计的设计图进行美化: JFrame美化的大致思路:先将JFrame去除默认美化效果, ...
- GOPATH和GOROOT
安装指定版本golang apt-get purge golang* //删除之前安装的文件 add-apt-repository ppa:evarlast/golang-1.8 apt-get up ...
- Java多线程之Deque与LinkedBlockingDeque深入分析
有大小的队列就叫有界队列 如 ArrayBlockingquue, 反之是无界队列 如 LinkedBlockingDeque. 单词写错了. 是的,LinkedBlockingDeque 永远满不 ...