NOIP模拟10.22

2014提高D2
A.无线网络发射器选址 暴力枚举选在哪即可。AC
B.寻找道路 图论+bfs+spfa AC
C.解方程 数论+筛法+枚举。 脑残没想到取模,去写高精度,结果当然是挂了。只拿了30.具体题解见这里

A

#include <bits/stdc++.h>
using namespace std;
#define N 30
#define inf 0x3f3f3f3f
#define ll long long
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int d,n,x[N],y[N],val[N],ans=0,cnt=0;
int main(){
//  freopen("a.in","r",stdin);
    d=read();n=read();
    for(int i=1;i<=n;++i) x[i]=read(),y[i]=read(),val[i]=read();
    for(int i=0;i<=128;++i)
        for(int j=0;j<=128;++j){
            int x1=max(0,i-d),x2=min(128,i+d),y1=max(0,j-d),y2=min(128,j+d);
            int res=0;
            for(int k=1;k<=n;++k)
                if(x[k]>=x1&&x[k]<=x2&&y[k]>=y1&&y[k]<=y2) res+=val[k];
            if(res>ans) ans=res,cnt=1;else if(res==ans) cnt++;
        }
    printf("%d %d\n",cnt,ans);
    return 0;
}

B

#include <bits/stdc++.h>
using namespace std;
#define N 10010
#define inf 0x3f3f3f3f
#define ll long long
#define M 200010
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,s,t,h[N],num=0,h1[N],d[N];
bool f[N],bad[N],inq[N];//f[i]--i能否到t,bad[i]--i能否在路径上 
struct edge{
    int to,next;
}data1[M],data[M];
inline void add(int x,int y){
    data[++num].to=y;data[num].next=h[x];h[x]=num;
    data1[num].to=x;data1[num].next=h1[y];h1[y]=num;
}
void bfs(int ss){
    queue<int>q;q.push(ss);f[ss]=1;
    while(!q.empty()){
        int x=q.front();q.pop();
        for(int i=h1[x];i;i=data1[i].next){
            int y=data1[i].to;if(!f[y]) f[y]=1,q.push(y);
        }
    }
}
void spfa(){
    queue<int>q;memset(d,inf,sizeof(d));
    q.push(s);d[s]=0;inq[s]=1;
    while(!q.empty()){
        int x=q.front();q.pop();inq[x]=0;
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;
            if(d[y]>d[x]+1){
                d[y]=d[x]+1;if(!inq[y]) inq[y]=1,q.push(y);
            }
        }
    }
}
int main(){
//  freopen("b.in","r",stdin);
    n=read();m=read();
    while(m--){
        int x=read(),y=read();if(x==y) continue;add(x,y);
    }s=read();t=read();bfs(t);
    for(int x=1;x<=n;++x)
        for(int i=h[x];i;i=data[i].next){
            int y=data[i].to;if(!f[y]){bad[x]=1;break;}
        }m=num;num=0;memset(h,0,sizeof(h)); 
    for(int x=1;x<=n;++x){
        if(bad[x]) continue;
        for(int i=h1[x];i;i=data1[i].next){
            int y=data1[i].to;if(bad[y]) continue;
            data[++num].to=x;data[num].next=h[y];h[y]=num;
        }
    }spfa();
    if(d[t]==inf) puts("-1");
    else printf("%d\n",d[t]);
    return 0;
}

C

#include <bits/stdc++.h>
using namespace std;
#define N 110
#define inf 0x3f3f3f3f
#define ll long long
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*f;
}
int n,m,prime[3]={10007,10917,30071},a[N][3];
bool f[40000][3];
char s[10010];
vector<int>ans;
bool calc(int x,int j){
    int tmp=a[n][j];
    for(int i=n-1;i>=0;--i)
        tmp=(tmp*x+a[i][j])%prime[j];
    return !tmp;
}
int main(){
//  freopen("a.in","r",stdin);
    n=read();m=read();
    for(int i=0;i<=n;++i){
        scanf("%s",s+1);int len=strlen(s+1);
        for(int j=0;j<3;++j){
            if(s[1]=='-'){
                int x=0;
                for(int ii=2;ii<=len;++ii)
                    x=x*10+s[ii]-'0',x%=prime[j];
                a[i][j]=-x;
            }else{
                int x=0;
                for(int ii=1;ii<=len;++ii)
                    x=x*10+s[ii]-'0',x%=prime[j];
                a[i][j]=x;
            }
        }       
    }
    for(int j=0;j<3;++j)
        for(int i=0;i<prime[j];++i)
            f[i][j]=calc(i,j);
    for(int i=1;i<=m;++i){
        bool flag=1;
        for(int j=0;j<3;++j)
            if(!f[i%prime[j]][j]) flag=0;
        if(flag) ans.push_back(i);
    }
    printf("%d\n",ans.size());
    for(int i=0;i<ans.size();++i) printf("%d\n",ans[i]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值