期望得分: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的更多相关文章

  1. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  2. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  3. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  4. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  5. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  6. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  7. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  8. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  9. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

  10. CH Round #49 - Streaming #4 (NOIP模拟赛Day2)

    A.二叉树的的根 题目:http://www.contesthunter.org/contest/CH%20Round%20%2349%20-%20Streaming%20%234%20(NOIP 模 ...

随机推荐

  1. JDK,JRE,JVM之间的关系

    JDK包括JRE包括JVM http://java-mzd.iteye.com/blog/838514

  2. 网站UI分析

    本次网站UI分析我选择的是我们石家庄铁道大学的网站,首先对于网站的分析建立在我经常使用鼠须的基础上,我可以很好的站在用户的角度来进行分析,否则对于你不熟悉的网站你可能是不能很好地体验到他的 结构. U ...

  3. ansible介绍和安装

    ansible是由 Python 编写的强大的配置管理解决方案,ansible 的特点就在于它的简洁与高效率 ansible与其他的配置管理工具不同点在于:不需要你在想要配置的每个节点上安装自己的组件 ...

  4. ping不通的常见原因和解决办法

    Ping是Windows.Unix和Linux系统下的一个命令.ping也属于一个通信协议,是TCP/IP协议的一部分.利用“ping”命令可以检查网络是否连通.如果ping不通则可以通过以下方式寻找 ...

  5. 迭代器 每迭代一次 指针往下面移动一次 除非JVM回收了内存 否则 他的指针不会回到原地

    迭代器 每迭代一次 指针往下面移动一次 除非JVM回收了内存 否则 他的指针不会回到原地

  6. MySQL二进制安装部署

    #使用二进制包安装mysql -linux-glibc2.-x86_64.tar.gz /data/ -linux-glibc2.-x86_64.tar.gz -C /data/ -linux-gli ...

  7. P2762 太空飞行计划问题(网络流24题之一)

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪器的 ...

  8. 【纪念】NOIP2018前夕——一些想说的话

    刚刚复习了一下相关的内容,决定一会儿就洗洗睡了.在睡觉之前,决定写点东西. 有的时候真的很迷茫,选择了一条超过自己能力范围的路,每天挣扎在各种各样难题的面前,文化成绩一落千丈……在从前觉得这一切都是有 ...

  9. Unity3D手游开发日记(5) - 适合移动平台的植被随风摆动

    一直在思考怎么让场景更有生机,我觉得植被的随风摆动是必不可少的.CE3引擎的植被bending就做得特别棒.我也准备在手机上做一套. 先分析一下植被摆动常见的几种做法.其实不管哪种做法,核心就是让植被 ...

  10. redis的Pub/Sub功能

    Pub/Sub功能(即Publish,Subscribe)意思是发布及订阅功能.简单的理解就像我们订阅blog一样,不同的是,这里的客户端与server端采用长连接建立推送机制,一个客户端发布消息,可 ...