【洛谷】NOIP2018原創模擬賽DAY1解題報告
阿新 • • 發佈:2019-02-15
T1:小凱的數字
題意:給定q個l,r,求l(l+1)(l+2)…(r-1)r模9的結果
很顯然,這是道考驗數(運)學(氣)的題目
結論:輸出(具體證明見比賽官方部落格)
需要注意的是不能直接乘,不然會爆long long
而且,這道題卡快讀。。。
程式碼:
#include<bits/stdc++.h> #define ll long long using namespace std; ll q,l,r; int main() { scanf("%lld",&q); for(ll i=1;i<=q;i++){ scanf("%lld%lld",&l,&r); ll fir,scd;fir=l+r;scd=(r-l+1); if(fir%2==0)fir/=2; else scd/=2; fir%=9;scd%=9; printf("%lld\n",(fir*scd)%9); } return 0; }
T2:密室
題意:哈利和羅賓在一張無向圖中,他們要到兩個房間去,而其中有一些房間是隻有哈利才能去的,最少需要多少時間,一共有n個點,m條邊,k個只有哈里才能去的房間
不難的圖論題,顯然只存在幾種情況,要麼哈利到A,羅賓到B 要麼哈利到B,羅賓到A 還有一種就是哈利一個人走過兩個房間(因為羅賓能走的路哈利都能走,而哈利走的路羅賓不一定都能走,所以一個人走,哈利絕不會比羅賓慢)
所以,只要找這幾條最短路就可以了
1.哈利到房間A,房間B的最短路n
2.羅賓到房間A,房間B的最短路
3.哈利從房間A到房間B的最短路
程式碼:
#include<bits/stdc++.h> #include<queue> #define N 200001 using namespace std; int n,m,k,ed1,ed2,cnt,head[N],v[N],dis[N],snake[N]; struct Edge{ int nxt,to,val; }tree[N]; void read(int &x){ char ch; bool ok; for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1; for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x; } void add(int a,int b,int c){ ++cnt; tree[cnt].nxt=head[a]; tree[cnt].to=b; tree[cnt].val=c; head[a]=cnt; } void spfa1(int v0){ for(int i=1;i<=n;i++)dis[i]=1000000001,v[i]=0; queue<int>q; q.push(v0);v[v0]=1;dis[v0]=0; while(q.size()){ int x=q.front();q.pop();v[x]=0; for(int i=head[x];i;i=tree[i].nxt){ int j=tree[i].to; if(dis[j]>dis[x]+tree[i].val){ dis[j]=dis[x]+tree[i].val; if(!v[j])q.push(j),v[j]=1; } } } } void spfa2(int v0){ for(int i=1;i<=n;i++)dis[i]=1000000001,v[i]=0; queue<int>q; q.push(v0);v[v0]=1;dis[v0]=0; while(q.size()){ int x=q.front();q.pop();v[x]=0; for(int i=head[x];i;i=tree[i].nxt){ int j=tree[i].to; if(!snake[j]&&dis[j]>dis[x]+tree[i].val){ dis[j]=dis[x]+tree[i].val; if(!v[j])q.push(j),v[j]=1; } } } } int main() { read(n),read(m),read(k); for(int i=1;i<=k;i++){ int s;read(s);snake[s]=1; } for(int i=1;i<=m;i++){ int a,b,c; read(a),read(b),read(c); add(a,b,c);add(b,a,c); } read(ed1),read(ed2); spfa1(1); int hd1=dis[ed1],hd2=dis[ed2]; spfa1(ed1);int hd12=dis[ed2]; spfa2(1); int rd1=dis[ed1],rd2=dis[ed2]; int ans1=min(hd1,hd2)+hd12;int ans2=min(max(hd1,rd2),max(hd2,rd1)); printf("%d",min(ans1,ans2)); return 0; }
T3:PION貪吃蛇
不會。。。