【洛谷】NOIP2018原创模拟赛DAY1解题报告
T1:小凯的数字
题意:给定q个l,r,求l(l+1)(l+2)...(r-1)r模9的结果
很显然,这是道考验数(运)学(气)的题目
结论:输出\((l+r)*(r-l+1)\over2\)(具体证明见比赛官方博客)
需要注意的是不能直接乘,不然会爆long long
而且,这道题卡快读。。。
Code:
#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的最短路
Code:
#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贪吃蛇
不会。。。