20180806 考试记录

T1 【NOIP2013模拟联考8】最短路(path)

Solution

设s为第0个标记点,t为k+1个跑k+1次最短路
然后全排列暴力求解qwq
注意最大值要设为long long范围最大值

Code

PS:各种修改qwq

//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define int long long
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;

int read() {
	int x=0,f=1; char c=getchar();
	while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
	return x*f;
}

const int N=50010,M=100010;
int cnt;
int head[N],to[M],w[M],nxt[M],poi[20],dis[20][N],vis[N];

priority_queue<PII,vector<PII>,greater<PII> > Q;
void dij(int s) {
	Q.push(PII(dis[s][poi[s]]=0,poi[s]));
	memset(vis,0,sizeof vis);
	while(!Q.empty()) {
		int u=Q.top().second; Q.pop();
		if(vis[u]) continue;
		E(i,u) {
			int v=to[i];
			if(dis[s][v]>dis[s][u]+w[i]) Q.push(PII(dis[s][v]=dis[s][u]+w[i],v));
		}
		vis[u]=1;
	}
}

int ans=3000000000ll;
bool fla[20];
void dfs(int num,int sum,int fr,int k) {
	if(sum>ans) return ;
	if(num==k) {ans=min(ans,sum+dis[fr][poi[k]]);return ;}
	F(i,1,k-1) if(!fla[i]) fla[i]=1,dfs(num+1,sum+dis[fr][poi[i]],i,k),fla[i]=0;
}

#define add(a,b,c) nxt[++cnt]=head[a],to[cnt]=b,w[cnt]=c,head[a]=cnt
signed main() {
//	freopen("path10.in","r",stdin);
	int n=read(),m=read(),k=read(),s=read(),t=read(),x,y,z;
	F(i,1,m) {
		x=read(),y=read(),z=read();
		add(x,y,z);
	}
	poi[0]=s;
	F(i,1,k) poi[i]=read();
	poi[++k]=t;
	F(i,0,k-1) F(j,1,n) dis[i][j]=3000000000ll;
	F(i,0,k-1) dij(i);
//	F(i,0,k) F(j,0,k) printf("dis[%d][%d]=%d
",i,poi[j],dis[i][poi[j]]);
	dfs(1,0,0,k);
	if(ans==3000000000ll) printf("-1");
	else printf("%lld",ans);
	return 0;
}

T2 【NOIP2013模拟联考11】剑与魔法(dragons)

Solution

贪心,保留范围内最大的值,最后注意把剩下的都加上

Code

//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define R(i,a,b) for(register int i=(b);i>=(a);i--)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;

int read() {
	int x=0,f=1; char c=getchar();
	while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
	return x*f;
}

const int N=200010;
char p[N];
int da[N],ans;

priority_queue<int,vector<int>,greater<int> > Q;
int main() {
	int n=read();
	F(i,1,n) scanf("
"),p[i]=getchar(),da[i]=read();
//	F(i,1,n) cout<<p[i]<<" ";
	int tot=0;
	F(i,1,n) if(p[i]!='e') tot++;
	if(tot<da[n]) {
		printf("-1");
		return 0;
	}
	F(i,1,n-1) {
		if(p[i]=='c') Q.push(da[i]);
		else {
			while(Q.size()>da[i]-1) {
				if(Q.empty()) {
					printf("-1");
					return 0;
				}
				Q.pop();
			}
		}
	}
	while(!Q.empty()) ans+=Q.top(),Q.pop();
	printf("%d",ans);
	return 0;
}

T3 【NOIP2013模拟联考13】三角形(triangle)

Solution

枚举一个点,算出另外n-1个点关于它的斜率并统计答案

Code

//By Menteur_Hxy
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define int long long
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define R(i,a,b) for(register int i=(b);i>=(a);i--)
#define E(i,u) for(register int i=head[u];i;i=nxt[i])
using namespace std;
typedef pair<int,int> PII;

int read() {
	int x=0,f=1; char c=getchar();
	while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
	return x*f;
}

const int N=3010;
int xi[N],yi[N];
double k[N];

signed main() {
	freopen("triangle.in","r",stdin);
	freopen("triangle.out","w",stdout);
	int n=read(),ans=n*(n-1)*(n-2)/6;
	F(i,1,n) xi[i]=read(),yi[i]=read();
	F(i,1,n) {
		int tot=0,reg=1;
		F(j,i+1,n) if(yi[i]!=yi[j]&&xi[i]!=xi[j]) k[++tot]=(double)(yi[j]-yi[i])/(xi[j]-xi[i]);
		sort(k+1,k+1+tot);
//		F(j,1,tot) cout<<k[j]<<" ";cout<<endl;
		F(j,2,tot) {
			if(k[j-1]==k[j]) reg++;
			if(k[j-1]!=k[j]||j==tot) ans-=reg*(reg-1)/2,reg=1;
		}
		reg=0;
		F(j,i+1,n) if(i!=j&&xi[i]==xi[j]) reg++;
		ans-=reg*(reg-1)/2;reg=0;
		F(j,i+1,n) if(i!=j&&yi[i]==yi[j]) reg++;
		ans-=reg*(reg-1)/2;reg=0;
	}
	printf("%lld",ans);
	return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9433762.html