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& ...
随机推荐
- java HashMap 内存泄漏
import java.util.HashMap; import java.util.Map; public class HashMapOver { public static void main(S ...
- Makefile 编写实例
make命令常用的三个选项: 1.-k:它的作用是让make命令在发现错误的时候仍然继续执行.我们可以利用这个选项在一次操作中发现未编译成功的源文件. 2.-n:它的作用是让make命令输出将要执行的 ...
- PAT (Basic Level) Practise (中文)- 1008. 数组元素循环右移问题 (20)
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1 A0 ...
- Java Object类 instanceof关键字 练习:判断是否为同一人 集合按照人的年龄排序,如果年龄相同按名字的字母顺序升序 Comparator比较器
package com.swift; public class Same_Person_Test { public static void main(String[] args) { /* * Obj ...
- cocos2dx 单张图片加密
cocos2dx 已经封装好读取加密的prv文件的方法,打开texturepacker,导入一张图片,在content protection中写入密钥,在texture format中选择prv格式 ...
- iOS 后台传输服务
后台传输服务 — 我们用水壶来比喻 (0:14) 后天传输服务是 iOS 7 引进的 API,它准许应用暂停或者中止之后,在后台继续执行网络服务(比如下载或者上传).举个例子,这正是 Dropbox ...
- odoo前端
bootstrap: http://www.runoob.com/bootstrap/bootstrap-tutorial.html javascript: http://www.runoob.com ...
- Unity基础-Input接口
input 底层的设备输入接口,在开发中很少用到 Input.GetKey() // Update is called once per frame void Update () { if (Inpu ...
- Vue基础指令集锦
v-model双向绑定数据 <input type="text" v-model="msg"> {{msg}} ###v-on 事件 <div ...
- web开发框架tornado
在server.py文件中 import tornado.web import tornado.ioloop import tornado.httpserver import config from ...