【noip2014提高组】【Day2】【解题报告】

来源:互联网 发布:淘宝营销活动有哪些 编辑:程序博客网 时间:2024/05/21 14:52

T1无线网络发射选址

题目链接:http://codevs.cn/problem/3730/

题解:

         直接枚举安装地点即可。

代码:

#include<iostream>#include<cstdio>using namespace std;int n,m,d,x,y,sum;long long a[300][300],maxx,z;int main(){  scanf("%d%d",&d,&n);  for (int i=1;i<=n;i++){   scanf("%d%d%lld",&x,&y,&z);a[x][y]=z;  }  for (int i=0;i<=128;i++)   for (int j=0;j<=128;j++){    long long temp(0);     for (int k=max(0,i-d);k<=min(i+d,128);k++)       for (int p=max(0,j-d);p<=min(j+d,128);p++)           temp+=a[k][p]; if (temp>maxx){maxx=temp;sum=1;}               else if (temp==maxx)sum++;   }  cout<<sum<<' '<<maxx<<endl;}

T2寻找道路

题目链接:http://codevs.cn/problem/3731/

题解:

           先建一个反图。从终点dfs一遍,处理出哪些点可以到终点。

           判断一下哪些点可能出现在最短路中。

           然后在原图中跑一遍bfs即可。

代码:

#include<iostream>#include<cstdio>#define N 10010#define M 200010using namespace std;struct use{int st,en;}e[M],ef[M];int point[N],l[N*10],pointf[N],next[M],nextf[M],cnt,x,y,n,m,s,t,dis[N];bool vis[N],pass[N],f[N];void add(int x,int y){  next[++cnt]=point[x];point[x]=cnt;e[cnt].st=x;e[cnt].en=y;  nextf[cnt]=pointf[y],pointf[y]=cnt;ef[cnt].st=y;ef[cnt].en=x;}void dfs(int x){  for (int i=pointf[x];i;i=nextf[i])    if (!vis[ef[i].en]){vis[ef[i].en]=1;dfs(ef[i].en);}}void bfs(int x){  int h=0,ti=1;l[ti]=x;f[x]=true;  while(h<ti){  int u=l[++h];if (u==t) break;  for (int i=point[u];i;i=next[i])    if (pass[e[i].en]&&!f[e[i].en]){l[++ti]=e[i].en;dis[e[i].en]=dis[u]+1;f[e[i].en]=1; }  }}int main(){  scanf("%d%d",&n,&m);  for (int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);}  scanf("%d%d",&s,&t);vis[t]=1;dfs(t);  for (int i=1;i<=n;i++){  bool f(true);    for (int j=point[i];j;j=next[j]) if (!vis[e[j].en]){f=false;break;}    if (f) pass[i]=true;   }   bfs(s);cout<<dis[t]<<endl;}

T3解方程

题目链接:http://codevs.cn/problem/3732/

题解:

         这应该是这次noip中最难的一道题了。

         首先有两个性质.若f(x)=0(mod p)则f(x+p)=0(mod p);

                                   若原方程成立。那么在方程两边同时模P,方程仍然成立。

         所以我们可以选几个大质数,首先预处理出1-(P-1)代入方程在模P意义下的结果。

         然后我们枚举解。每次用这几个大质数检验一下即可。

         这样出错的概率非常低。。

代码:

         

#include<iostream>#include<cstdio>#include<cstring>#define M 1000010#define N 10010using namespace std;int p[5]={11261,23333,10007,21893,14843};int ans[M],a[5][N],t[5][200],len,c[5][50010],n,m;char ch[N];int cal(int tt){  int temp(0);  for (int i=0;i<=n;i++) (temp+=a[tt][i]*t[tt][i])%=p[tt];  if (temp<0) temp+=p[tt];  return temp;} bool check(int x){  for (int i=0;i<5;i++) if(c[i][x%p[i]]!=0) return false;  return true;}int main(){  scanf("%d%d",&n,&m);  for (int i=0;i<=n;i++){     scanf("%s",ch+1);int f(1);len=strlen(ch+1);     for (int j=0;j<5;j++){       if (ch[1]!='-') a[j][i]=ch[1]-'0';else f=0;       for (int k=2;k<=len;k++) (a[j][i]=a[j][i]*10+ch[k]-'0')%=p[j];   if (!f) a[j][i]=-a[j][i];   }  }  for (int i=0;i<5;i++)    for (int j=1;j<p[i];j++){      t[i][0]=1;for(int k=1;k<=n;k++) (t[i][k]=t[i][k-1]*j)%=p[i];       c[i][j]=cal(i);    }  for (int i=1;i<=m;i++) if (check(i)) ans[++ans[0]]=i;cout<<ans[0]<<endl;  for (int i=1;i<=ans[0];i++) cout<<ans[i]<<endl;}


1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一个人欠我钱跑了我该怎么办 买房子时间长了成危楼了怎么办 别人欠我钱人找不到了怎么办 欠银行信用卡钱人失踪了怎么办 欧洲卡车模拟2没油了怎么办 蓝牙安装包里没有微信怎么办 腾讯手游模拟器玩全军出击卡怎么办 手游cf用模拟器画面很抖怎么办 腾讯手游助手模拟器游戏卡死怎么办 腾讯手游模拟器提示注册以满怎么办 手游绝地求生被检测成模拟器怎么办 腾讯手游助手模拟器内存不够怎么办 微信视频对方听不到我的声音怎么办 学生考试传纸条作弊老师应怎么办 苹果手机微信小游戏没有声音怎么办 红米手机游戏下好了安装不了怎么办 小米手机sd卡存储已满怎么办 英雄联盟峡谷之巅资格被收回怎么办 人进监狱之前信用卡没还怎么办 荒野行动资源文件下载卡住了怎么办 荒野行动绑定的手机号停机了怎么办 不小心误点了爱奇艺扣款了怎么办 和别人吵架别人先骂你怎么办 自己人被带到了缅甸黑社会了怎么办 绝地求生忘记复制钥匙激活码怎么办 绝地求生买的钥匙激活码丢了怎么办 蓝河奶粉宝宝吃了不长肉怎么办 苹果ios版本太低激活不了怎么办 脸上被油烫伤了 起了水泡怎么办 皮肤被油烫伤起来个水泡怎么办 去泰国旅游没来得及兑换泰铢怎么办 游戏和安卓 不和 出现黑屏怎么办 邻居把垃圾放在楼梯口不丢怎么办 58热敏小票打印机口松了怎么办 王鹏的眼睛今天起疙瘩了怎么办 背包带子老从肩膀滑下来怎么办 绝地求生用手机流量更新不成怎么办 手机拍的视频在电脑上放不了怎么办 炉石传说手机点登陆游戏闪退怎么办 车到信号屏蔽区一键启动不了怎么办 王者荣耀战队活跃度满了怎么办