NOIP模拟3
期望得分:30+90+100=220
实际得分:30+0+10=40
T1智障错误:n*m是n行m列,硬是做成了m行n列
T2智障错误:读入三个数写了两个%d
T3智障错误:数值相同不代表是同一个数
既眼瘸又脑残,NOIP这样后悔去吧!
T1
n*m网格,有S种颜色。
按从上到下,从左到右的顺序涂色。
相邻的相同色块可得一份,问最大得分
n,S<=100000,m<=4
只有最多4列
1列:顺着涂
2列:先涂可以涂偶数个
3列:先涂%3=0的,然后一个%3=1和一个%3=2的组合,剩余的顺着涂
4列:先涂%4=0的,然后涂偶数个%4=2的,然后一个%4=1和一个%4=3的组合,如果%4=2的还剩1个,就与%4=1或%4=3的两个组合,剩余的随便涂
具体实现的时候:
假设每一种颜色都从左上角开始涂
那么这一种颜色a[i]对答案的贡献是
if(a[i]>=m) ans+=a[i]/m*(m*2-1)-m+a[i]%m+max(a[i]%m-1,0);
else ans+=a[i]-1;
a[i]/m*(m*2-1)-m 是完整的行的贡献
a[i]%m+max(a[i]%m-1,0)是不完整的1行的贡献
m=1或m=2的时候直接输出
m=3时,如果%3=2的比%3=1的多,即不能完全组合,那么就要有几个%3=2的连着图,画图可知,每三个%3=2的连着图,会损失一个相邻的相同色块(有一个%3=2的1个在上一行最后面)。所以答案还要减去(%3=2的个数 - %3=1的个数)/3
m=4时,与m=3的同理,答案还要减去(%4=3的个数 - %4=1的个数)/2
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[],sum[];
int main()
{
freopen("diyiti.in","r",stdin);
freopen("diyiti.out","w",stdout);
int n,m,s,T,ans;
scanf("%d",&T);
while(T--)
{
ans=;
memset(sum,,sizeof(sum));
scanf("%d%d%d",&n,&m,&s);
for(int i=;i<=s;i++)
{
scanf("%d",&a[i]);
sum[a[i]%m]++;
if(a[i]>=m) ans+=a[i]/m*(m*-)-m+a[i]%m+max(a[i]%m-,);
else ans+=a[i]-;
}
if(m==)
{
if(sum[]>sum[]) ans-=(sum[]-sum[])/;
}
else if(m==)
{
if(sum[]>sum[]) ans-=(sum[]-sum[])/;
}
printf("%d\n",ans);
}
}
T2
一个数列,长为n
在里面加n-1个加号或乘号
问方案所有方案的数列和
有部分数据数列全为1
那么枚举有i个乘号,ans=Σ(C(n-1,2)*(n-i))
一、基本思路O(n^3)
dp[i]表示到第i个数的答案
枚举前一个加号在j后面
那么到j一共有2^(j-1)种方案,每种方案在j后面都是一个加号,加号后面全是乘号
令tot=a[j+1]*a[j+2]……*a[i]
dp[i]=Σ(dp[j]+2^(j-1)*tot)
#include<cstdio>
#include<cstring>
#define mod 1000000007
using namespace std;
int n,a[];
long long ans,b[];
long long C[][],cf[];
long long dp[],pre[],inv[];
bool ok;
void dfs(int now,int jia,long long sum[])
{
if(now==n+)
{
for(int i=;i<=n;i++) ans+=sum[i],ans%=mod;
return;
}
long long tmp[];
memcpy(tmp,sum,sizeof(tmp));
tmp[now]=a[now];
dfs(now+,now,tmp);
tmp[now]-=a[now];
if(jia)
{
tmp[jia]*=a[now];
dfs(now+,jia,tmp);
tmp[jia]/=a[now];
} }
long long pow(long long a,long long b)
{
long long res=;
while(b)
{
if(b&) res*=a,res%=mod;
b>>=; a*=a; a%=mod;
}
return res;
}
int main()
{
freopen("dierti.in","r",stdin);
freopen("dierti.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]!=) ok=true;
}
if(ok && n<=)
{
dfs(,,b);
printf("%I64d",ans);
return ;
}
if(!ok)
{
for(int i=;i<=;i++) C[i][]=;
for(int i=;i<=;i++)
for(int j=;j<=i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%mod;
for(int i=;i<n;i++)
ans=(ans+C[n-][i]*(n-i)%mod)%mod;
printf("%I64d\n",ans);
return ;
}
else
{
cf[]=;
for(int i=;i<=n;i++) cf[i]=cf[i-]*%mod;
long long tot;
pre[]=;
for(int i=;i<=n;i++) pre[i]=pre[i-]*a[i]%mod;
for(int i=;i<=n;i++) inv[i]=pow(pre[i],mod-);
dp[]=a[];
for(int i=;i<=n;i++)
{
dp[i]=pre[i];
for(int j=;j<i;j++) //枚举上一个加号在谁后面
dp[i]=(dp[i]+dp[j]+cf[j-]*pre[i]%mod*inv[j]%mod)%mod;
}
printf("%I64d",dp[n]);
}
}
二、预处理前缀积O(n^2)
省去上面循环计算tot的部分,预处理前缀积,
tot=pre[i]/pre[j]=pre[i]*pre[j]的逆元
预处理前缀积的逆元
#include<cstdio>
#include<cstring>
#define mod 1000000007
using namespace std;
int n,a[];
long long ans,b[];
long long C[][],cf[];
long long dp[],pre[],inv[];
bool ok;
void dfs(int now,int jia,long long sum[])
{
if(now==n+)
{
for(int i=;i<=n;i++) ans+=sum[i],ans%=mod;
return;
}
long long tmp[];
memcpy(tmp,sum,sizeof(tmp));
tmp[now]=a[now];
dfs(now+,now,tmp);
tmp[now]-=a[now];
if(jia)
{
tmp[jia]*=a[now];
dfs(now+,jia,tmp);
tmp[jia]/=a[now];
} }
long long pow(long long a,long long b)
{
long long res=;
while(b)
{
if(b&) res*=a,res%=mod;
b>>=; a*=a; a%=mod;
}
return res;
}
int main()
{
freopen("dierti.in","r",stdin);
freopen("dierti.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]!=) ok=true;
}
if(ok && n<=)
{
dfs(,,b);
printf("%I64d",ans);
return ;
}
if(!ok)
{
for(int i=;i<=;i++) C[i][]=;
for(int i=;i<=;i++)
for(int j=;j<=i;j++)
C[i][j]=(C[i-][j]+C[i-][j-])%mod;
for(int i=;i<n;i++)
ans=(ans+C[n-][i]*(n-i)%mod)%mod;
printf("%I64d\n",ans);
return ;
}
else
{
cf[]=;
for(int i=;i<=n;i++) cf[i]=cf[i-]*%mod;
long long tot;
pre[]=;
for(int i=;i<=n;i++) pre[i]=pre[i-]*a[i]%mod;
for(int i=;i<=n;i++) inv[i]=pow(pre[i],mod-);
dp[]=a[];
for(int i=;i<=n;i++)
{
dp[i]=pre[i];
for(int j=;j<i;j++) //枚举上一个加号在谁后面
dp[i]=(dp[i]+dp[j]+cf[j-]*pre[i]%mod*inv[j]%mod)%mod;
}
printf("%I64d",dp[n]);
}
}
三、在上面的基础上前缀和优化O(n)
#include<cstdio>
#include<cstring>
#define mod 1000000007
using namespace std;
int n,a[];
long long cf[];
long long dp[],pre[],inv[];
long long pow(long long a,long long b)
{
long long res=;
while(b)
{
if(b&) res*=a,res%=mod;
b>>=; a*=a; a%=mod;
}
return res;
}
int main()
{
freopen("dierti.in","r",stdin);
freopen("dierti.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
cf[]=;
for(int i=;i<=n;i++) cf[i]=cf[i-]*%mod;
long long tot;
pre[]=;
for(int i=;i<=n;i++) pre[i]=pre[i-]*a[i]%mod;
for(int i=;i<=n;i++) inv[i]=pow(pre[i],mod-);
long long sum1=,sum2=;
for(int i=;i<=n;i++)
{
dp[i]=(sum1+sum2*pre[i]%mod)%mod;
sum1=(sum1+dp[i])%mod;
sum2=(sum2+cf[i-]%mod*inv[i]%mod)%mod;
}
printf("%I64d",dp[n]);
}
T3
如果这个网格是好的,那么存在一个数,它既是所在行最小值,又是所在列最大值
所以一边枚举一边维护每一列<=这个数的个数less_l,每一行>=这个数的个数more_h
对于每个值,取最大的less_i,more_h
ans=max(n-less_i+n-more_h)
一边枚举一边维护有一种维护后缀数组的感觉
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 1001
using namespace std;
pair<int,int>a[N*N];
void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
}
int less_l[N*N],more_h[N*N],tmp[N*N];
int main()
{
freopen("disanti.in","r",stdin);
freopen("disanti.out","w",stdout);
int n,m;
read(n);
m=n*n;
for(int i=;i<m;i++) read(a[i].first),a[i].second=i;
sort(a,a+m);
int x,j;
for(int i=;i<m;i=j)
{
less_l[i]=less_l[i-];
for(j=i;j<m && a[i].first==a[j].first;j++)
{
x=a[j].second;
tmp[x%n]++;
less_l[i]=max(less_l[i],tmp[x%n]);
}
for(int k=i+;k<j;k++) less_l[k]=less_l[i];
}
memset(tmp,,sizeof(tmp));
for(int i=m-;i>=;i=j)
{
more_h[i]=more_h[i+];
for(j=i;j>= && a[i].first==a[j].first;j--)
{
x=a[j].second;
tmp[x/n]++;
more_h[i]=max(more_h[i],tmp[x/n]);
}
for(int k=i-;k>j;k--) more_h[k]=more_h[i];
}
int ans=m;
for(int i=;i<m;i++) ans=min(ans,n-less_l[i]+n-more_h[i]);
printf("%d",ans);
}
考场代码,如果网格没有重复的数,可能会AC
#include<cstdio>
#include<algorithm>
using namespace std;
int a[][];
int key[],hash[];
int h[][],l[][];
int main()
{
//freopen("disanti.in","r",stdin);
// freopen("disanti.out","w",stdout);
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++) key[j]=hash[j]=a[i][j];
sort(hash+,hash+n+);
for(int j=;j<=n;j++) key[j]=lower_bound(hash+,hash+n+,key[j])-hash;
for(int j=;j<=n;j++) h[i][j]=key[j]-;
}
for(int j=;j<=n;j++)
{
for(int i=;i<=n;i++) key[i]=hash[i]=a[i][j];
sort(hash+,hash+n+);
for(int i=;i<=n;i++) key[i]=lower_bound(hash+,hash+n+,key[i])-hash;
for(int i=;i<=n;i++) l[i][j]=n-key[i];
}
int ans=n*n;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
ans=min(ans,h[i][j]+l[i][j]);
printf("%d",ans);
}
NOIP模拟3的更多相关文章
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
- CH Round #49 - Streaming #4 (NOIP模拟赛Day2)
A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...
随机推荐
- “我爱淘”第二冲刺阶段Scrum站立会议6
完成任务: 完成学院分类的点击查看书籍功能,可以点击书的条目查看书的详细信息. 计划任务: 将书的详细信息进行完善,并且可以点击收藏以及已预订等功能. 遇到问题: 分类功能,根据不同学院,自动将数据库 ...
- CS小分队第一阶段冲刺站立会议(5月14日)
昨日成果:为抽号计时器添加了第一类抽号,基本实现界面,功能出现了一些错误 遇到问题:我预想通过timer控件来实现随机抽号而拜托随机生成数,但是出现了只有个位随机滚动,其他位数不动的现象,我预计是数值 ...
- 【IdentityServer4文档】- 使用密码保护 API
使用密码保护 API OAuth 2.0 协议允许资源拥有者给客户端密码授权:客户端向令牌服务发送用户密码,以获取代表该用户的访问令牌. 该规范建议仅将“资源所有者密码授予”用于“可信”(或旧版)应用 ...
- DescriptionAttribute Class
指定属性或事件的描述. [Description("The image associated with the control"),Category("Appearanc ...
- DB2 日志
跟Oracle类似DB2也分为两个模式,日志循环vs归档日志,也就是非归档和归档模式,下面对这两种模式做简单的介绍. 日志循环 日志循环是默认方式,也就是非归档模式,这种模式只支持backup off ...
- 发布vue插件到npm上
总体分为2个步骤 一,先写好插件 二,发布到npm上面 一,写vue插件 vue有一个开放的方法install,在vue插件需要写在这个方法里面,在vue官网,里面说的很清楚,这个方法里面可以是全局方 ...
- 【C】多线程编程笔记
1. pthread_create(pthread类型指针变量 ,NULL ,函数 ,函数参数[多个参数用结构体传]) 2. pthread_join(pthread类型指针变量, 返回一般为null ...
- 微信小程序组件 自定义单选
<view class='userperson'> <view class='f30 flexca'>请选择您的注册身份</view> <view class ...
- vue-cli配置axios,并基于axios进行后台请求函数封装
文章https://www.cnblogs.com/XHappyness/p/7677153.html已经对axios配置进行了说明,后台请求时可直接this.$axios直接进行.这里的缺点是后端请 ...
- Maven学习——1、安装与修改Maven的本地仓库路径
1.1.下载 官网 http://maven.apache.org/download.cgi 1.2.安装配置 apache-maven-3.3.3-bin.zip 解压下载的压缩包 1.3.配置环境 ...