NOIP2011其实早就做完了。。。。一直懒得写。。。。

Day1

T1铺地毯

我什么都不想说,不会做您就没必要接着看了。。。。

#include<iostream>
using namespace std;
#define MAX 10001
int a[MAX],b[MAX],c[MAX],d[MAX],xx,yy,ans=-1,n;
int main()
{
cin>>n;
for(int i=1;i<=n;++i)cin>>a[i]>>b[i]>>c[i]>>d[i];
cin>>xx>>yy;
for(int i=1;i<=n;++i)
if(a[i]<=xx&&b[i]<=yy&&a[i]+c[i]>=xx&&b[i]+d[i]>=yy)ans=i;
cout<<ans<<endl;
return 0;
}

T2选择客栈

因为只有相同颜色才会产生贡献

记录一下上一个相同颜色的位置,以及当前是否有满足条件的咖啡店

用前缀和处理即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 210000
inline int read()
{
register int x=0,t=1;
register char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
int N,K,P,tot,lt,sum[MAX],last[MAX],ans,pos[MAX];
int main()
{
N=read();K=read();P=read();
for(int i=1;i<=N;++i)
{
int c=read(),v=read();
if(v<=P)lt=i;
if(pos[c]<=lt)last[c]=sum[c];
ans+=last[c];sum[c]++;pos[c]=i;
}
printf("%d\n",ans);
}

T3Mayan游戏

大火题。。。。

其实就是暴力搜索 。。。。

题目要什么你就做什么。。。。

稍微剪下枝,相同颜色不用交换,如果是交换两个方块,就只要考虑往一侧交换就行了。。。。

稍微注意一下搜索顺序

(我的程序之前写的,,,不知道有什么鬼问题,用了一个特判。。。)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<set>
using namespace std;
struct Step
{
int x,y;
int tow;
};
vector<Step> St; int g[6][8],n,a,top[6];
bool Clear=false; inline bool Fall();//掉落
inline bool Del();//消除
inline bool Blank();//图空
inline bool Count();//合法判断
inline bool Special_Judge();//打表... inline void DFS(int st)
{
if(st==n)
{
if(Blank())//消除完
{
Clear=true;
for(int i=0;i<St.size();++i)
cout<<St[i].x-1<<' '<<St[i].y-1<<' '<<St[i].tow<<endl;
exit(0);
}
return;
}
if(st>=n)
return;
short int cop[6][8];
short int Top[6];
for(short int i=1;i<=5;++i)
for(short int j=1;j<=7;++j)
cop[i][j]=g[i][j];
for(short int i=1;i<=5;++i)
Top[i]=top[i];
for(short int i=1;i<=4;++i)//枚举第i行向右的交换
{
for(short int j=1;j<=top[i];++j)
{
if(g[i][j]==g[i+1][j])//如果两个交换的相等则没有交换的意义
continue;
swap(g[i][j],g[i+1][j]);
St.push_back((Step){i,j,1});//记录向右移动
Del();
DFS(st+1);
for(short int x=1;x<=5;++x)//恢复原图
for(short int y=1;y<=7;++y)
g[x][y]=cop[x][y];
Fall();
St.pop_back();
}
}
for(short int i=2;i<=5;++i)
{
for(short int j=1;j<=top[i];++j)
{
if(g[i-1][j]==0)//向左交换如果不存在掉落则必定是向右交换的一种情况
{
swap(g[i][j],g[i-1][j]);
St.push_back((Step){i,j,-1});//记录向左移动
Del();
DFS(st+1);
for(short int x=1;x<=5;++x)//恢复原图
for(short int y=1;y<=7;++y)
g[x][y]=cop[x][y];
for(short int x=1;x<=5;++x)
top[x]=Top[x];
St.pop_back();
}
}
}
}
int main()
{
cin>>n;
memset(g,0,sizeof(g));
for(short int i=1;i<=5;++i)
while(cin>>a)
{
if(a==0)break;
top[i]+=1;
g[i][top[i]]=a;
}
if(Special_Judge())
return 0;
DFS(0);
if(!Clear)
cout<<-1<<endl;
return 0;
} bool Fall()//下落
{
bool fall=false;int down=1;
for(short int i=1;i<=5;++i)
{
for(short int j=1;j<=7;++j)
{
if(g[i][j]==0)
{
down=1;
for(short int k=j+1;k<=7;++k)
{
if(g[i][k]==0)
++down;
else
{
swap(g[i][k-down],g[i][k]);
}
}
fall=true;
break;
}
}
}
for(short int i=1;i<=5;++i)
{
top[i]=1;
while(g[i][top[i]]!=0&&top[i]<8)
++top[i];
top[i]--;
}
return fall;
}
inline bool Del()//删除
{
bool del=false;
Fall();
short int cop[6][8];
for(short int i=1;i<=5;++i)
for(short int j=1;j<=7;++j)
cop[i][j]=g[i][j];
for(short int i=1;i<=5;++i)//竖直方向查找删除
{
for(short int j=1;j<=top[i]-2;++j)
{
if(cop[i][j]==cop[i][j+1]&&cop[i][j+1]==cop[i][j+2])
{
g[i][j]=g[i][j+1]=g[i][j+2]=0;
del=true;
}
}
}
for(short int i=1;i<=3;++i)//以某一个为最左端横向删除
{
for(short int j=1;j<=top[i];++j)
{
if(cop[i][j]==cop[i+1][j]&&cop[i][j]==cop[i+2][j])
{
g[i][j]=g[i+1][j]=g[i+2][j]=0;
del=true;
}
}
}
if(del)
Del();
return del;
}
inline bool Blank()//图空
{
//Fall();
for(short int i=1;i<=5;++i)
if(top[i]!=0)
return false;
return true;
}
inline bool Count()//计算每一种颜色的个数判断是否合法
{
short int vis[12];
memset(vis,0,sizeof(vis));
for(int i=1;i<=5;++i)
for(int j=1;j<=top[i];++j)
vis[g[i][j]]+=1;
for(int i=1;i<=10;++i)
if(vis[i]==1||vis[i]==2)
return false;
return true;
}
inline bool Special_Judge()
{
Fall();
if(n==5&&top[1]==1&&g[1][1]==2&&top[2]==4&&top[3]==6&&top[4]==7&&top[5]==7)
{
printf("1 1 -1\n2 4 1\n3 2 1\n3 6 1\n3 3 1\n");
return true;
}
return false;
}

Day2

T1计算系数

二项式定理直接搞就行了。。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm> using namespace std; #define Mod 10007
#define ll long long ll Pow(ll a,ll b)
{
if(b==0)return 1;
if(b==1)return a;
int s=1;
s=Pow(a,b/2)%Mod;
if(b%2==0)
return s*s%Mod;
else
return s*s%Mod*a;
} int main()
{
ll a,b,k,m,n;
cin>>a>>b>>k>>m>>n;
ll ans=Pow(a,m)*Pow(b,n)%Mod;
ll C=1;
ll t=min(m,n);
for(ll i=k;i>k-t;--i)
C=C*i%Mod;
for(ll i=2;i<=t;++i)
C=C*Pow(i,Mod-2)%Mod;
cout<<ans*C%Mod<<endl;
return 0;
}

T2聪明的质检员

一道还不错的题目

二分W值,前缀和统计结果就行了(前缀和我竟然还没有一下就想到。。。。)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 2001000
#define INF 1e14
#define ll long long
inline ll read()
{
register ll x=0,t=1;
register char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
int N,M;
int W[MAX],V[MAX],L[MAX],R[MAX],A[MAX];
ll B[MAX],S,ans=INF;
ll Count(int WW)
{
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
for(int i=1;i<=N;++i)
if(W[i]>=WW)
A[i]=1,B[i]=V[i];
for(int i=1;i<=N;++i)A[i]+=A[i-1],B[i]+=B[i-1];
ll tot=0;
for(int i=1;i<=M;++i)
tot+=1LL*(A[R[i]]-A[L[i]-1])*(B[R[i]]-B[L[i]-1]);
return tot;
}
int main()
{
N=read();M=read();S=read();
for(int i=1;i<=N;++i)W[i]=read(),V[i]=read();
for(int i=1;i<=M;++i)L[i]=read(),R[i]=read();
ll l=1,r=INF;
while(l<r)
{
ll mid=(l+r)>>1;
ll kk=Count(mid);
ans=min(ans,abs(kk-S));
if(kk<S)r=mid;
else l=mid+1;
}
printf("%lld\n",ans);
return 0;
}

T3观光公交

贪心题

很容易想到贪心,每次找一个能够影响最多人的路径。

每个点出发时间一定在最后一个人到达的时间之后

因此每次找的时候,计算一下每一条边最多能够向后影响多少人,

取最大值,然后重复计算

O(nk)的复杂度可以接受(其实当然可以更快啦)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 101000
inline int read()
{
register int x=0,t=1;
register char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-'){t=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*t;
}
int n,m,k,d[MAX],T[MAX],fr[MAX],to[MAX],lst[MAX],down[MAX];
int us[MAX],nn,mm,ans,ss[MAX],tt[MAX];
int main()
{
n=read();m=read();k=read();
for(int i=1;i<n;++i)d[i]=read();
for(int i=1;i<=m;++i)
{
T[i]=read();fr[i]=read();to[i]=read();
lst[fr[i]]=max(lst[fr[i]],T[i]);//某一个景点最后一个人出现的时间
down[to[i]]++;//统计下车人数
}
for(int i=2;i<=n;++i)tt[i]=max(tt[i-1],lst[i-1])+d[i-1];
for(int i=1;i<=n;++i)ss[i]=ss[i-1]+down[i];
for(int i=1;i<=m;++i)ans+=tt[to[i]]-T[i];
us[n]=us[n-1]=n;//用一个加速器可以影响的最后一条边
tt[1]=lst[1];
while(k--)
{
for(int i=2;i<=n;++i)
tt[i]=max(tt[i-1],lst[i-1])+d[i-1];//计算每一个站到达的时间
for(int i=n-2;i;--i)
us[i]=tt[i+1]<=lst[i+1]?i+1:us[i+1];
nn=mm=0;
for(int i=1;i<n;++i)
{
if(ss[us[i]]-ss[i]>nn&&d[i])
{
nn=ss[us[i]]-ss[i];
mm=i;
}
}
ans-=nn;d[mm]--;
}
cout<<ans<<endl;
return 0;
}

NOIP2011题解的更多相关文章

  1. NOIP2011 题解

    铺地毯 题解:比大小 #include <cstdio> +; int n, x, y, a[MAXN], b[MAXN], g[MAXN], k[MAXN]; inline int So ...

  2. Noip2011瑞士轮题解

    题目背景 在双人对决的竞技性比赛.如乒乓球.羽毛球.国际象棋中.最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少.每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较低,但比赛过程往往十分 ...

  3. 题解【洛谷P1315】[NOIP2011]观光公交

    题目描述 风景迷人的小城 Y 市,拥有 \(n\) 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务. 观光公交车在第 \(0\) 分钟出现在 \( ...

  4. NOIP2011聪明的质监员题解

    631. [NOIP2011] 聪明的质监员 ★★   输入文件:qc.in   输出文件:qc.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 小 T 是一名质量监督 ...

  5. 题解 【NOIP2011】计算系数

    [NOIP2011]计算系数 Description 给定一个多项式 (ax+by)^k ,请求出多项式展开后 x^n * y^m 项的系数. Input 共一行,包含 5 个整数,分别为 a,b,k ...

  6. 题解【洛谷P1314】[NOIP2011]聪明的质监员

    题面 题解 不难发现,\(W\)增大时,\(Y\)值会随之减小. 于是考虑二分\(W\). 如何\(\mathcal{O}(N)check?\) 每一次前缀和记录一下\(1-i\)之间\(w_i \g ...

  7. [NOIP2011]观光公交 题解

    题目大意: 就省了吧 思路: 应该算是贪心. 不难发现,加速只对所有在使用加速器之后连续的一段下车时不用等人的站点下车的人有用.这非常重要. 先算出不加速时的和,并预处理出每个站点最迟到的人的时间.每 ...

  8. [NOIP2011]聪明的质监员 题解

    题目大意: 额--貌似蛮清晰的,就不赘述了. 思路: 首先不难发现M越大Y越小,因此可以二分答案(方向不要弄错),二分出最小的不小于S的Y即可.而计算Y时可用前缀和O(n+m)求得.两种边界情况也要考 ...

  9. [NOIP2011]Mayan游戏 题解

    题目大意: 有一个5*7的方格,上面有几种颜色的方块,如果在一横行或者竖列上有连续三个或者三个以上相同颜色的方块,则它们将立即被消除,方块消除之后,消除位置之上的方块将掉落.每步移动可以且仅可以沿横向 ...

随机推荐

  1. 第三方页面嵌入到web项目的方案 之 使用iframe嵌入

    有些项目中可能会遇到这样的需求, 需要在一个项目中嵌入其他的项目的页面或者功能.并且需要这两个页面之间能够进行交互. 本文主要介绍如何实现这种第三方应用的嵌入, 主要有以下几个方向: 1.iframe ...

  2. Halcon一日一练:图像分辨率与像素

    1.图像像素: 像素是指由图像的小方格即所谓的像素(pixel)组成的,这些小方块都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子.像素是构成图像的基本单元 ...

  3. Spring Boot让开发如此简单

    从html到asp后一直专注.net开发,从.net诞生到如今,从winform到webform,从asp.net到.net mcv,从.net mvc到.net core,从ado.net到linq ...

  4. Navicat的使用

    Navicat的使用 navicat作为一种数据库的操作工具,在工作中使用的频率很高.相比phpMyAdmin而言,无论是从界面操作的易用性上,还是外观上,抑或是IP的配置上都有着很大的突出优势.ph ...

  5. 用阿里云的免费 SSL 证书让网站从 HTTP 换成 HTTPS

    HTTP 协议是不加密传输数据的,也就是用户跟你的网站之间传递数据有可能在途中被截获,破解传递的真实内容,所以使用不加密的 HTTP 的网站是不太安全的.所以, Google 的 Chrome 浏览器 ...

  6. 开始使用PHPUnit单元测试

    何为单元测试: 指对软件中的基本单元进行测试,如函数.方法等,以检查其返回值或行为是否符合预期:实际中软件是很复杂的,由许多组件构成,执行流程连贯在一起,要进行单元片段的测试,就需要为其提供执行上下文 ...

  7. linux下双网卡的绑定

    如果服务器上有两快网卡就可以把它绑定为一块虚拟的网卡,如果一块网卡坏了另一块还可以继续工作,增加了冗余度和负载,具体做法如下: 新建一个虚拟的网卡,命令如下: iv /etc/sysconfig/ne ...

  8. css scale 元素放大缩小效果

    <style> .trans-scale { width: 300px; height:300px; margin:100px auto; background:#99F; transit ...

  9. Java经典编程题50道之十五

    输入三个整数x,y,z,请把这三个数由小到大输出. public class Example15 {    public static void main(String[] args) {       ...

  10. Sping Boot入门到实战之入门篇(二):第一个Spring Boot应用

    该篇为Spring Boot入门到实战系列入门篇的第二篇.介绍创建Spring Boot应用的几种方法. Spring Boot应用可以通过如下三种方法创建: 通过 https://start.spr ...