“与”

(and.pas/.c/.cpp)

时间限制:1s;空间限制64MB

题目描述:

给你一个长度为n的序列A,请你求出一对Ai,Aj(1<=i<j<=n)使Ai“与”Aj最大。

Ps:“与”表示位运算and,在c++中表示为&。

输入描述:

第一行为n。接下来n行,一行一个数字表示Ai。

输出描述:

输出最大的Ai“与”Aj的结果。

样例输入:

3

8

10

2

样例输出:

8

样例解释:

8 and 10 = 8

8 and 2 = 0

10 and 2 = 2

数据范围:

20%的数据保证n<=5000

100%的数据保证 n<=3*10^5,0<=Ai<=10^9

/*
10^9内的二进制最多只有30位,所以我们可以从高到低枚举每一位
如果发现有两个或两个以上的数这位上有1,就说明答案的这一位一定有1,方法比较贪心,正确性很明显
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 300010
int a[maxn],n,ans,len;
bool vis[maxn];
int main(){
freopen("and.in","r",stdin);
freopen("and.out","w",stdout);
scanf("%d",&n);
int x;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i>=;i--){
int flag=;
for(int j=;j<=n;j++)
if((a[j]&(<<(i-)))&&!vis[j])flag++;
if(flag>=){
ans+=(<<(i-));
for(int j=;j<=n;j++)
if(!(a[j]&(<<(i-))))vis[j]=;
}
}
printf("%d",ans);
}

100分

小象涂色

(elephant.pas/.c/.cpp)

时间限制:1s,空间限制128MB

题目描述:

小象喜欢为箱子涂色。小象现在有c种颜色,编号为0~c-1;还有n个箱子,编号为1~n,最开始每个箱子的颜色为1。小象涂色时喜欢遵循灵感:它将箱子按编号排成一排,每次涂色时,它随机选择[L,R]这个区间里的一些箱子(不选看做选0个),为之涂上随机一种颜色。若一个颜色为a的箱子被涂上b色,那么这个箱子的颜色会变成(a*b)mod c。请问在k次涂色后,所有箱子颜色的编号和期望为多少?

输入描述:

第一行为T,表示有T组测试数据。

对于每组数据,第一行为三个整数n,c,k。

接下来k行,每行两个整数Li,Ri,表示第i个操作的L和R。

输出描述:

对于每组测试数据,输出所有箱子颜色编号和的期望值,结果保留9位小数。

样例输入:

3

3 2 2

2 2

1 3

1 3 1

1 1

5 2 2

3 4

2 4

样例输出:

2.062500000

1.000000000

3.875000000

数据范围:

40%的数据1 <= T <= 5,1 <= n, k <= 15,2 <= c <= 20

100%的数据满足1 <= T <= 10,1 <= n, k <= 50,2 <= c <= 100,1 <= Li <= Ri <= n

/*
一道有关期望的dp。首先可知每个操作中,一个物品会被染色的概率为1/2,用某种颜色染色的概率为1/c。
40分的方程是用f[i][j][k]表示第i个物品在j次操作次数后颜色变为k的概率,时间复杂度大概是O(T*N*K*c^2)
60分要考虑到所有物品具有相似性,即n个物品本质是相同的,所以不用枚举物品f[i][j]表示一个物品操作i次颜色变为j的概率。满足:
f[i+1][j]+=f[i][j]*(1/2) f[i+1][(j*b)%c]+=f[i][j]*[(1/2)*(1/c)]
初始值f[0][1]=1,答案就是∑f[i][j]*j (i表示该箱子的操作次数,0 <= j<c)。复杂度O(T*K*c^2) */
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,n,c,K,mc,cnt[];
double dp[][],ans;
int main(){
//freopen("Cola.txt","r",stdin);
freopen("elephant.in","r",stdin);
freopen("elephant.out","w",stdout);
scanf("%d",&T);
while(T--){
memset(dp,,sizeof(dp));
memset(cnt,,sizeof(cnt));
ans=;mc=;
scanf("%d%d%d",&n,&c,&K);
for(int i=;i<=K;i++){
int l,r;
scanf("%d%d",&l,&r);
for(int j=l;j<=r;j++){
cnt[j]++;
mc=max(cnt[j],mc);
}
}
dp[][]=;
for(int i=;i<mc;i++){
for(int j=;j<c;j++){
dp[i+][j]+=dp[i][j]/;
for(int k=;k<c;k++){
dp[i+][(j*k)%c]+=dp[i][j]/(*c);
}
}
}
for(int i=;i<=n;i++){
for(int j=;j<c;j++){
ans+=dp[cnt[i]][j]*j;//概率乘以收益
}
}
printf("%.9lf\n",ans);
}
return ;
}

100分 概率dp

行动!行动!

(move.pas/.c/.cpp)

时间限制:1s;空间限制:128MB

题目描述:

大CX国的大兵Jack接到一项任务:敌方占领了n座城市(编号0~n-1),有些城市之间有双向道路相连。Jack需要空降在一个城市S,并徒步沿那些道路移动到T城市。虽然Jack每从一个城市到另一个城市都会受伤流血,但大CX国毕竟有着“过硬”的军事实力,它不仅已经算出Jack在每条道路上会损失的血量,还给Jack提供了k个“简易急救包”,一个包可以让Jack在一条路上的流血量为0。Jack想知道自己最少会流多少血,不过他毕竟是无脑的大兵,需要你的帮助。

输入描述:

第一行有三个整数n,m,k,分别表示城市数,道路数和急救包个数。

第二行有两个整数,S,T。分别表示Jack空降到的城市编号和最终要到的城市。

接下来有m行,每行三个整数a,b,c,表示城市a与城市b之间有一条双向道路。

输出描述:

Jack最少要流的血量。

样例输入:

5 6 1

0 3

3 4 5

0 1 5

0 2 100

1 2 5

2 4 5

2 4 3

样例输出:

8

数据范围:

对于30%的数据,2<=n<=50,1<=m<=300,k=0;

对于50%的数据,2<=n<=600,1<=m<=6000,0<=k<=1;

对于100%的数据,2<=n<=10000,1<=m<=50000,0<=k<=10.

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 10010
int n,m,k,s,t,head[maxn],num,cnt,a[maxn];
long long path[maxn];
bool vis[maxn];
long long ans=;
struct node{
int to,pre;
long long v;
}e[*];
void Insert(int from,int to,long long v){
e[++num].to=to;
e[num].v=v;
e[num].pre=head[from];
head[from]=num;
}
void check(long long sum){
memset(a,,sizeof(a));
for(int i=;i<=cnt;i++)a[i]=path[i];
sort(a+,a+cnt+);
for(int i=cnt,j=;j<=k;i--,j++)sum-=a[i];
ans=min(ans,sum);
}
void dfs(int now,long long sum){
if(now==t){
check(sum);
return;
}
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(vis[to])continue;
vis[to]=;
cnt++;
path[cnt]=e[i].v;
dfs(to,sum+e[i].v);
vis[to]=;
cnt--;
}
}
void spfa(){
queue<int>q;
memset(path,,sizeof(path));
q.push(s);vis[s]=;path[s]=;
while(!q.empty()){
int now=q.front();q.pop();vis[now]=;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(path[to]>path[now]+e[i].v){
path[to]=path[now]+e[i].v;
if(!vis[to]){
vis[to]=;
q.push(to);
}
}
}
}
cout<<path[t];
}
long long qread(){
long long i=;
char ch=getchar();
while(ch<''||ch>''){ch=getchar();}
while(ch<=''&&ch>=''){i=i*+ch-'';ch=getchar();}
return i;
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("move.in","r",stdin);
freopen("move.out","w",stdout);
scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
int x,y,z;
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
z=qread();
Insert(x,y,z);
Insert(y,x,z);
}
if(k==){
spfa();
return ;
}
vis[s]=;
dfs(s,);
cout<<ans;
return ;
}

40分 暴力

/*
因为k<=10所以拓展点的时候直接x+10+y了
但其实k==10的话这样拓展会重复...
幸好只有一个点...
谨慎谨慎..
还有就是 这题这样做的话卡SPFA
要用dij
*/
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<queue>
#define pa pair<int,int>
#define mk make_pair
using namespace std;
int num,head[*],n,m,k,S,T;
struct node{
int to,pre,v;
}e[**];
void Insert(int from,int to,int v){
for(int i=head[from];i;i=e[i].pre)
if(e[i].to==to){
e[i].v=min(e[i].v,v);
return;
}
e[++num].to=to;
e[num].v=v;
e[num].pre=head[from];
head[from]=num;
}
int Cal(int x,int y){
return x*+y;
}
priority_queue<pa,vector<pa>,greater<pa> >q;
bool vis[*];
int dis[*];
void Dij(int s){
q.push(mk(,s));
memset(dis,/,sizeof(dis));
dis[s]=;
while(!q.empty()){
int now=q.top().second;q.pop();
if(vis[now])continue;
vis[now]=;
for(int i=head[now];i;i=e[i].pre){
int to=e[i].to;
if(dis[to]>e[i].v+dis[now]){
dis[to]=e[i].v+dis[now];
q.push(mk(dis[to],to));
}
}
}
}
int main(){
freopen("move.in","r",stdin);
freopen("move.out","w",stdout);
scanf("%d%d%d%d%d",&n,&m,&k,&S,&T);
S++;T++;
int x,y,z;
for(int i=;i<=m;i++){
scanf("%d%d%d",&x,&y,&z);
x++,y++;
for(int j=;j<=k;j++){
int x1=Cal(x,j),y1=Cal(y,j);
Insert(x1,y1,z);
Insert(y1,x1,z);
if(j){
int x2=Cal(x,j-),y2=Cal(y,j-);
Insert(x1,y2,);
Insert(y1,x2,);
}
}
}
Dij(Cal(S,k));
int ans=0x7fffffff;
for(int i=;i<=k;i++)
ans=min(ans,dis[Cal(T,i)]);
printf("%d",ans);
}

100分 分层图+堆优化Dij

2017-9-2 NOIP模拟赛的更多相关文章

  1. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

  2. 2017 10.25 NOIP模拟赛

    期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w    O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...

  3. 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)

    期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...

  4. NOIP模拟赛20161022

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

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

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

  6. NOIP模拟赛 by hzwer

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

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

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

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

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

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

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

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

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

随机推荐

  1. 【linux】ubuntu16.04安装vncserver实现远程访问图形界面

    # 步骤 1 - 安装 X11VNC  sudo apt install x11vnc -y # 步骤 2 - 配置访问密码 sudo x11vnc -storepasswd /etc/x11vnc. ...

  2. ansible2

    一.ansible模块(yum.pip.service.conr.user.group) 你是否知道ansible一共有多少模块呢?可以用以下命令查看: [root@localhost ~]# ans ...

  3. MVC+Ext.net零基础学习记录(四)

    在上一篇文章[MVC+Ext.net零基础学习记录(三)]中提到了利用MVC的Area可以做到项目分离,但是实际操作起来还是有很多问题的.比如,对于物理资源的访问,会报:没有相关资源 开始的时候,我在 ...

  4. JAVA-关键字&标识符

    关键字: 关键字就是在java程序中具备特殊含义的标识符.关键字一般用于描述一个程序的结构或者表示数据类型.他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. ...

  5. 分享知识-快乐自己:Struts2中 获取 Request和Session

    目录结构: POM: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEnco ...

  6. IDEAL葵花宝典:java代码开发规范插件 checkstyle、visualVM、PMD 插件

    前言: visualVM: 运行java程序的时候启动visualvm,方便查看jvm的情况 比如堆内存大小的分配:某个对象占用了多大的内存,jvm调优必备工具. checkstyle: CheckS ...

  7. Apache Flink vs Apache Spark——感觉二者是互相抄袭啊 看谁的好就抄过来 Flink支持在runtime中的有环数据流,这样表示机器学习算法更有效而且更有效率

    Apache Flink是什么 Flink是一款新的大数据处理引擎,目标是统一不同来源的数据处理.这个目标看起来和Spark和类似.没错,Flink也在尝试解决 Spark在解决的问题.这两套系统都在 ...

  8. centos7在VMware下配置网络连接

    安装成功以后,首先更改vmwar的虚拟网络设置 1.参考连接:http://www.cnblogs.com/liongis/p/3265458.html 2.然后将虚拟机的设置里面将网络配置的连接方式 ...

  9. (转)select、poll、epoll之间的区别总结[整理]

    select,poll,epoll都是IO多路复用的机制.I/O多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作.但select ...

  10. C字符串末尾的'\0'问题

    C语言的字符串要注意最后一位默认是'/0'的问题.这是一个易错点. strlen()计算长度时不考虑末尾的'\0' //例1 void test1() { ]; "; strcpy( str ...