[CSP-S模拟测试73]题解
A.小P的2048
作为一个看B哥玩了一个寒假的人这种题闭眼切好吧
模拟即可。程序模块化后直接复制粘贴。
说什么模拟不能复制粘贴的都没水平
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
typedef long long ll;
int n,m;
ll a[11][11];
int num=0;
ll b[11][11];
ll ans=0;
ll Lmove(int x)
{
ll res=0,last=0;int now=0;
for(int i=1;i<=n;i++)
{
if(!a[x][i])continue;
if(last!=a[x][i])
{
last=a[x][i];
a[x][i]=0;
now++;
a[x][now]=last;
}
else
{
last=0;
res+=a[x][i]*2;
ll val=a[x][i]*2;
a[x][i]=0;
a[x][now]=val;
}
}
return res;
}
ll Rmove(int x)
{
ll res=0,last=0;int now=n+1;
for(int i=n;i;i--)
{
if(!a[x][i])continue;
if(last!=a[x][i])
{
last=a[x][i];
a[x][i]=0;
now--;
a[x][now]=last;
}
else
{
last=0;
res+=a[x][i]*2;
ll val=a[x][i]*2;
a[x][i]=0;
a[x][now]=val;
}
}
return res;
}
ll Umove(int x)
{
ll res=0,last=0;int now=0;
for(int i=1;i<=n;i++)
{
if(!a[i][x])continue;
if(last!=a[i][x])
{
last=a[i][x];
a[i][x]=0;
now++;
a[now][x]=last;
}
else
{
last=0;
res+=a[i][x]*2;
ll val=a[i][x]*2;
a[i][x]=0;
a[now][x]=val;
}
}
return res;
}
ll Dmove(int x)
{
ll res=0,last=0;int now=n+1;
for(int i=n;i;i--)
{
if(!a[i][x])continue;
if(last!=a[i][x])
{
last=a[i][x];
a[i][x]=0;
now--;
a[now][x]=last;
}
else
{
last=0;
res+=a[i][x]*2;
ll val=a[i][x]*2;
a[i][x]=0;
a[now][x]=val;
}
}
return res;
}
ll LM()
{
ll res=0;
for(int i=1;i<=n;i++)
res+=Lmove(i);
return res;
}
ll RM()
{
ll res=0;
for(int i=1;i<=n;i++)
res+=Rmove(i);
return res;
}
ll UM()
{
ll res=0;
for(int i=1;i<=n;i++)
res+=Umove(i);
return res;
}
ll DM()
{
ll res=0;
for(int i=1;i<=n;i++)
res+=Dmove(i);
return res;
}
void cpy()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
b[i][j]=a[i][j];
}
bool dif()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(a[i][j]!=b[i][j])return 1;
return 0;
}
int ask()
{
int res=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(!a[i][j])res++;
return res;
}
bool find(int pos,int val)
{
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(a[i][j])continue;
cnt++;
if(cnt==pos)
{
a[i][j]=val;return 1;
}
}
return 0;
}
void print()
{
printf("%d\n%lld\n",num,ans);
exit(0);
}
int main()
{
n=read();m=read();
int x_1=read(),y_1=read(),v_1=read(),x_2=read(),y_2=read(),v_2=read();
a[x_1][y_1]=v_1;a[x_2][y_2]=v_2;
for(int i=1;i<=m;i++)
{
int dv=read(),K=read(),v=read();
cpy();
switch(dv)
{
case 0:ans+=UM();break;
case 1:ans+=DM();break;
case 2:ans+=LM();break;
case 3:ans+=RM();break;
}
if(dif())num++;
else print();
int r=ask();
int p=(K%r)+1;
find(p,v);
}
print();
return 0;
}
B.小P的单调数列
结论:必然存在一个最优子序列,它的单调区间数不超过2。
那么,其实最优子序列只有可能是单增或单增+单减。
正反都跑一遍dp,树状数组优化即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<unordered_map>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=1e5+5;
typedef long long ll;
int a[N],n,b[N],type;
ll f[N],g[N],c[N];
double ans=0.0;
unordered_map<int,int> link;
int lb(int x){return x&-x;}
void update(int x,ll val)
{
for( ;x<=type;x+=lb(x))
c[x]=max(c[x],val);
}
ll ask(int x)
{
ll res=0;
for( ;x;x-=lb(x))
res=max(res,c[x]);
return res;
} int main()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read(),b[i]=a[i];
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
if(link.find(b[i])==link.end())link[b[i]]=++type; /**for(int i=1;i<=n;i++)
cout<<link[a[i]]<<' ';puts(" ");*/ f[1]=a[1];
update(link[a[1]],f[1]);
for(int i=2;i<=n;i++)
{
if(link[a[i]]==1)f[i]=a[i];
else f[i]=ask(link[a[i]]-1)+a[i];
update(link[a[i]],f[i]);
}
memset(c,0,sizeof(c));
g[n]=a[n];
update(link[a[n]],g[n]);
for(int i=n-1;i;i--)
{
if(link[a[i]]==1)g[i]=a[i];
else g[i]=ask(link[a[i]]-1)+a[i];
update(link[a[i]],g[i]);
}
for(int i=1;i<=n;i++)
{
ans=max(ans,0.5*(g[i]+f[i]-a[i]));
ans=max(ans,1.0*f[i]);
}
printf("%.3lf\n",ans);
return 0;
}
C.小P的生成树
首先,复数可以直接看成向量。
如果我们已经得到生成树各边的和向量的方向,想使它的模长最大,那么就应该让各边在这个方向上的投影之和最大。
针对这个条件,我们可以把每条边在该方向上的投影作为新的权值,跑最大生成树即可。
如何得到这个方向向量?
直接枚举角度,得到它的方向向量$(\cos \theta ,\sin \theta)$。然后重新赋边权跑Kruskal即可。取最优答案。
#include<bits/stdc++.h>
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int N=55,M=205;
int n,m,fa[N];
double ans=0.0,al;
struct edge
{
int x,y;
double a,b,w;
friend bool operator < (const edge &x,const edge &y)
{
return x.w>y.w;
}
}e[M];
double modl(double a,double b)
{
return sqrt(a*a+b*b);
}
int findf(int x)
{
if(fa[x]==x)return x;
return fa[x]=findf(fa[x]);
}
void Kruskal()
{
int t=0;
double resa=0.0,resb=0.0;
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
e[i].w=e[i].a*cos(al)+e[i].b*sin(al);
sort(e+1,e+m+1);
for(int i=1;i<=m;i++)
{
int x=e[i].x,y=e[i].y,fx=findf(x),fy=findf(y);
if(fx!=fy)
{
fa[fx]=fy;
resa+=e[i].a;resb+=e[i].b;
t++;
}
if(t==n-1)break;
}
ans=max(ans,modl(resa,resb));
}
int main()
{
n=read();m=read();
for(int i=1;i<=m;i++)
e[i].x=read(),e[i].y=read(),e[i].a=read(),e[i].b=read();
for(al=0.000;al<=6.300;al+=0.001)
Kruskal();
printf("%.6lf\n",ans);
return 0; }
[CSP-S模拟测试73]题解的更多相关文章
- [考试反思]1014csp-s模拟测试73:侵蚀
嗯...还是没有改变那个现状 依旧只是打满了暴力,虽说T2打的的确比暴力好很多,但是因为出题人没有设分所以和暴力等同. 离上面的分差还是大的很,下面还是追的很紧 而且进几场的排名也是连续下滑... 虽 ...
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- CSP-S模拟测试 88 题解
T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...
- CSP-S 模拟测试92 题解
话说我怎么觉得我没咕多长时间啊,怎么就又落了20多场题解啊 T1 array: 根据题意不难列出二元一次方程,于是可以用exgcd求解,然而还有一个限制条件就是$abs(x)+abs(y)$最小,这好 ...
- CSP-S 模拟测试57题解
人生第一次A,B层一块考rank2,虽然说分差没几分,但还是值得纪念. 题解: T1 天空龙: 大神题,因为我从不写快读也没有写考场注释的习惯,所以不会做,全hzoi就kx会做,kx真大神级人物. T ...
- CSP-S 模拟测试 51 题解
考试过程: 惯例先看一遍三道题,T1 一开始反应要求割点,但是这是有向图,肯定不能求割点,康了一下数据范围,有40%是树的,还不错,决定待会在打. 看T2 字符串题,完了我字符串最弱了,肯定只能打暴力 ...
- CSP-S 模拟测试 45 题解
由于咕掉的题解太多了,所以只能趁改完不动题的时间,来补补坑qwq,还是太弱了. 考试过程: 到新机房的第一次考试,貌似海星? 第一题一开始就觉得是个贪心,但以为所有小怪兽都要打完,所以想复杂了,但后来 ...
- [CSP-S模拟测试97]题解
A.小盆友的游戏 感觉题解解释的很牵强啊……还是打表找规律比较靠谱 对于每个人,它构造了一个期望函数$f(x)$,设它的跟班个数为$cnt[x]$,那么令$f(x)=2^{cnt[x]}-1$(??鬼 ...
- [CSP-S模拟测试96]题解
以后不能再借没改完题的理由不写题解了…… A.求和 求$\sum \sum i+j-1$ 柿子就不化了吧……这年头pj都不考这么弱智的公式化简了…… 坑点1:模数不定,可能没有2的逆元,那么只要先把乘 ...
随机推荐
- vlan trunk配置
vlan trunk配置 Trunk:中继干道 作用:一条链路能承载多个vlan的流量,并对不同vlan的流量进行不同标记 trunk能够使vlan跨越交换机 PT配置 配置vlan:两台交换机同样的 ...
- 【Unity知识点】安卓游戏如何在切后台后继续运行
解决方法很简单,在android项目AndroidManifest.xml文件中的activity中添加如下内容: android:configChanges="fontScale|keyb ...
- _exit和exit的区别
在linux的标准库函数中,有一套称作高级I/O的函数,我们熟知的printf .fopen .fread .fwrite都在此列,他们也被称作缓冲I/O.其特征是对应每一个打开的文件,都存在一个缓冲 ...
- Show Me the Code
最近在练习写Python代码,拥有150多道程序员面试题的LeetCode注重算法的实现,锻炼思维,还能在线测试代码的正确性,而Python练习册涉及到了Python实际的应用,锻炼解决问题的能力,托 ...
- securecrt(CRT)导入会话
securecrt是个非常流行的远程管理维护工具,支持fssh.ssh2.telnet等多种协议,也支持中文.设备管理多了,自行手工添加也是很累的活.偷下懒,从别人那复制下文件,倒入到自己的secur ...
- jvm性能监控(4)–JVM的监控工具Jconsole
下面主要说一下怎么JConsole远程连接springboot 项目 java \-Djava.rmi.server.hostname=192.131.149.42 \-Dcom.sun.manag ...
- Android应用程序开发中碰到的错误和获得的小经验
1,Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE Description:这表示手机内存不足,对内存较小的手机经常会出现这样的问题,从 ...
- tornado后台小框架
import tornado.ioloop import tornado.web """使用get方法提交过来数据就是用get方法,使用post执行post方法这个框架的 ...
- vue-cli3脚手架的安装
如果之前有安装过其他的版本的话,要先卸载 卸载:npm uninstall vue-cli-g 或 yarn global remove vue-cli 安装:npm i @vue/cli -g ...
- vue.js(6)--v-model
v-model实现数据的双向绑定(简易计算器实例) 简易计算器实例 <!DOCTYPE html> <html lang="en"> <head> ...