UKIEPC 2017

A Alien Sunset

暴力枚举t

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

struct node{
	int h,r,t;
}info[205];

int n;

bool suit(int i,int t){
	int tt=t%info[i].h;
	if(info[i].r<=info[i].t) return tt>=info[i].t||tt<=info[i].r;
	return tt>=info[i].t&&tt<=info[i].r;
};

bool check(int t){
	for(int i=1;i<=n;i++){
		if(!suit(i,t)) return 0;
	}
	return 1;
}

int main(){
	//freopen("in.txt","r",stdin);
	scanf("%d",&n);
	int mx=2;
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&info[i].h,&info[i].r,&info[i].t);
		mx=max(mx,info[i].h);
	}
	int ans = -1;
	for(int t=0;t<1825*mx;t++)
		if(check(t)){
			ans=t;break;
		}
	if(ans==-1) puts("impossible");
	else printf("%d
",ans);
	return 0;
}

B Breaking Biscuits

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const double eps = 1e-8;

int sgn(double x){
	if(x>eps) return 1;
	if(x<-eps) return -1;
	return 0;
}

struct point{
	double x,y;
	point(){}
	point(double _x,double _y):x(_x),y(_y){}
	void in(){
		scanf("%lf%lf",&x,&y);
	}
}v[1005];

struct L{
	point p,v;
	L(){}
	L(point _p,point _v):p(_p),v(_v){}
	double len(){
		double x=p.x-v.x;
		double y=p.y-v.y;
		return sqrt(x*x+y*y);
	}
}T;

double dist(point a,L T){
	double x1=T.p.x-a.x;
	double y1=T.p.y-a.y;
	double x2=T.v.x-a.x;
	double y2=T.v.y-a.y;
	double area=x1*y2-x2*y1;
	double len=T.len();
	return area/len;
}

int main(){
	//freopen("in.txt","r",stdin);
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		v[i].in();
	double res = 1e30;
	for(int i=1;i<=n;i++)
		for(int j=1;j<i;j++){
			T=L(v[i],v[j]);
			double l=1e50,r=-1e50;
			for(int k=1;k<=n;k++){
				double dis=dist(v[k],T);
				l=min(l,dis);
				r=max(r,dis);
			}
			res=min(res,r-l);
		}
	printf("%.8lf
",res);
	return 0;
}

C

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

map<string,int> mp;
string st;
int num[10];
int main(){
	//freopen("in.txt","r",stdin);
	mp["red"]=1;mp["yellow"]=2;mp["green"]=3;
	mp["brown"]=4;mp["blue"]=5;mp["pink"]=6;
	mp["black"]=7;
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>st;
		num[mp[st]]++;
	}
	int mxid=0;
	for(int i=7;i>=1;i--){
		if(num[i]){
			mxid=i;
			break;
		} 
	}
	int rednum=num[1];
	if(rednum==0){
		int ans=0;
		for(int i=1;i<=7;i++) ans+=num[i]*i;
		printf("%d
",ans);
	}
	else{
		int ans=0;
		if(mxid==1) ans=1;
		else{
			ans+=(mxid+1)*num[1];
			for(int i=2;i<=7;i++) ans+=i*num[i];
		}
		printf("%d
",ans);
	}
	return 0;
}

D

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
char s[1050];
int id[1050];
int to[1050];
int main() {
	//freopen("in.txt","r",stdin);
	scanf("%s", s + 1);
	int n = strlen(s + 1);
	for (int i = 1; i <= n; i++) id[i] = i;
	for (int i = 1; i < n; i++) {
		for (int j = 1; j < n; j++) {
			if (s[j] > s[j + 1]) {
				swap(s[j], s[j + 1]);
				swap(id[j], id[j + 1]);
			}
		}
	}
	vector<pair<int, int> > res;
	for (int i = 1; i <= n; i++)
		to[id[i]] = i;
	while (1) {
		bool flg = 1;
		for (int i = 1; i <= n; ++i) {
			if (id[i] != i) {
				flg = 0;
				res.push_back(make_pair(i, id[i]));
				int t = id[i];
				int tt = to[i];
				id[tt] = id[i];
				to[t] = tt;
				id[i] = i;
			}
		}
		if (flg) break;
	}
	for (int i = (int)res.size() - 1; i >= 0; i--) {
		printf("%d %d
", res[i].second, res[i].first);
	}
	return 0;
}

E

#include <bits/stdc++.h>

using namespace std;
const int maxn = 5000 + 100;
int w[maxn], c[maxn];
struct node {
	int x, id;
} a[maxn];
int vis[maxn], res[maxn];
int n, m;

bool cmp(node A,node B){
	return A.x<B.x;
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i].x), a[i].id = i;
	for (int i = 1; i <= m; i++) scanf("%d", &c[i]);
	for (int i = 1; i <= m; i++) scanf("%d", &w[i]);
	sort(a + 1, a + 1 + n, cmp);
	int flag = 1;
	for (int i = n; i >= 1; i--) {
		int mm = 10000000;
		int id = -1;
		for (int j = 1; j <= m; j++) {
			if (c[j] >= a[i].x && vis[j] == 0) {
				if (mm > w[j]) {
					mm = w[j], id = j;
				}
			}
		}
		if (id == -1) {
			flag = 0; break;
		}
		res[a[i].id] = id;
		vis[id] = 1;
	}
	if (flag == 0) printf("impossible
");
	else {
		for (int i = 1; i <= n; i++) {
			if (i != 1) printf(" ");
			printf("%d", res[i]);
		}
		printf("
");
	}
	return 0;
}

F

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 405;
double f[maxn][maxn];
int n,k;

int main(){
	//freopen("in.txt","r",stdin);
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++)f[0][i]=i;
    for(int i=1;i<=k;i++){
    	f[i][0]=max(f[i][0],(f[i-1][0]+f[i-1][1])/2);
    	for(int j=1;j<=n;j++){
        	f[i][j]=(f[i-1][j]+f[i-1][j-1])/2;
        	if(j<n)f[i][j]=max(f[i][j],(f[i-1][j]+f[i-1][j+1])/2);
    	}
    }
	printf("%.8lf
",f[k][0]);
	return 0;
}

G

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

struct node{
	int x,y,z;
	bool operator == (const node &a) const{
		return x==a.x&&y==a.y&&z==a.z;
	}
	void in(){
		scanf("%d%d%d",&x,&y,&z);
	}
}n1,n2,p1,p2,tmp;

int link(node A,node B){
	if(A.x==B.x&&A.y==B.y&&A.z==B.z+1)
		return 6;
	if(A.x==B.x&&A.y==B.y&&A.z==B.z-1)
		return 5;
	if(A.x==B.x&&A.y==B.y+1&&A.z==B.z)
		return 4;
	if(A.x==B.x&&A.y==B.y-1&&A.z==B.z)
		return 3;
	if(A.x==B.x+1&&A.y==B.y&&A.z==B.z)
		return 2;
	if(A.x==B.x-1&&A.y==B.y&&A.z==B.z)
		return 1;
	return 0;
}

int main(){
	//freopen("in.txt","r",stdin);
	n1.in();p1.in();
	n2.in();p2.in();
	printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
	int flg=0;
	while(1){
		if(n1==p1&&n2==p2) break;
		//n1
		int opt=link(n1,n2);
		if(opt&&flg==0){
			if(opt==6){
				n1.x--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.z--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.z--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.x++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
			}
			if(opt==5){
				n1.x--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.z++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.z++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.x--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
			}
			if(opt==4){
				n1.x--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.y--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.y--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.x++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
			}
			if(opt==3){
				n1.x--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.y++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.y++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.x++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
			}
			if(opt==2){
				n1.y--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.x--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.x--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.y++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
			}
			if(opt==1){
				n1.y--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.x++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.x++;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
				n1.y--;
				printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
			}
			flg=1;
		} else {
			tmp=n1;
			if(n1.x!=p1.x){
				if(n1.x<p1.x) n1.x++;
				else n1.x--;
			} else {
				if(n1.y!=p1.y){
					if(n1.y<p1.y) n1.y++;
					else n1.y--;
				} else {
					if(n1.z!=p1.z){
						//puts("SDASD");
						if(n1.z<p1.z) n1.z++;
						else n1.z--;
					}
				}
			}
			//n2
			if(n2.z!=p2.z){
				if(n2.z<p2.z) n2.z++;
				else n2.z--;
			} else {
				if(n2.y!=p2.y){
					if(n2.y<p2.y) n2.y++;
					else n2.y--;
				} else {
					if(n2.x!=p2.x){
						if(n2.x<p2.x) n2.x++;
						else n2.x--;
					}
				}
			}
			if(n1==n2){
				n1=tmp;
			}
		}
		printf("(%d %d %d) (%d %d %d)
",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
	}
	return 0;
}

H

#include <bits/stdc++.h>

using namespace std;
const int maxn = 50000+5;
int B,P;
int d[maxn];
int a[maxn],p[maxn];
int f,r,tail,n;
int Q[maxn<<8];
int res[maxn<<8];

bool check(int x){
	if(p[x]>=P) return 0;
	if(x>1){
		if(abs(d[p[x]+1]-d[p[x-1]])>B || 
		   abs(d[p[x]+1]-d[p[x-1]])<a[x]||
		   abs(d[p[x]+1]-d[p[x-1]])<a[x-1]) return 0;
	}
	if(x<tail){
		if(abs(d[p[x]+1]-d[p[x+1]])>B || 
		   abs(d[p[x]+1]-d[p[x+1]])<a[x]||
		   abs(d[p[x]+1]-d[p[x+1]])<a[x+1]) return 0;
	}
	return 1;
}

int main(){
	scanf("%d",&B);
	scanf("%d",&P);
	for(int i=1;i<=P;i++)
		scanf("%d",d+i);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d",a+i,p+i);
	}
	f=1,r=0;
	for(int i=1;i<=n;i++){
		if(p[i]>=P) break;
		tail=i;
		Q[++r]=i;
	}
	int top = 0;
	while(f<=r){
		int x=Q[f++];
		if(check(x)){
			p[x]++;
			res[top++]=x;
			while(tail&&p[tail]>=P) tail--;
			if(x>1) Q[++r]=x-1;
			if(x<tail) Q[++r]=x+1;
			if(x<=tail) Q[++r]=x;
		}
	}
	bool ok=1;
	for(int i=1;i<=n;i++)
		if(p[i]<P) ok=0;
	if(!ok) puts("impossible");
	else
		for(int i=0;i<top;i++)
			printf("%d%c",res[i]," 
"[i==top-1]);
    return 0;
}

I

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 1005;
int a[maxn];

int main(){
	//freopen("in.txt","r",stdin);
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	int Mn=INT_MAX,ans;
	int T;
	scanf("%d",&T);
	for(int i=1;i<=n;i++){
		if(T%a[i]<Mn){
			Mn=T%a[i];
			ans=a[i];
		}
	}
	cout<<ans;
	return 0;
}

J

#include <bits/stdc++.h>

using namespace std;
const int maxn=2000+10;
int n,a[maxn];
long double ans;
int main() {
	scanf("%d",&n);
	int tmp;
	for(int i=1;i<=n;i++) {
		scanf("%d",&tmp);
		if(tmp==0) ans+=2.0;
		else if(tmp==1) ans+=1.0;
		else if(tmp==2) ans+=(1.0/2);
		else if(tmp==4) ans+=(1.0/4);
		else if(tmp==8) ans+=(1.0/8);
		else if(tmp==16) ans+=(1.0/16);
 	}
 	printf("%.8Lf",ans);
	return 0;
}

K

#include<bits/stdc++.h>
#define maxn 1050
#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int b[maxn]; 
struct node{
	int x,y;
}a[maxn];
struct Edge{
	int from,to,cap,flow;
};
struct Dinic{
	int n,m,s,t;
	vector<Edge>edges;
	vector<int>G[maxn];
	bool vis[maxn];
	int d[maxn];
	int cur[maxn];
	void ClearAll(int n){
		for(int i=0;i<n;i++) G[i].clear();
		edges.clear();
	}
	void AddEdge(int from,int to,int cap){
		edges.push_back((Edge){from,to,cap,0});
		edges.push_back((Edge){to,from,0,0});
		m=edges.size();
		G[from].push_back(m-2);
		G[to].push_back(m-1);
	}
	bool BFS(){
		memset(vis,0,sizeof(vis));
		queue<int>Q;
		Q.push(s);
		vis[s]=1;
		d[s]=0;
		while(!Q.empty()){
			int x=Q.front();
			Q.pop();
			for(int i=0;i<G[x].size();i++){
				Edge& e=edges[G[x][i]];
				if(!vis[e.to] && e.cap>e.flow){
					vis[e.to]=1;
					d[e.to]=d[x]+1;
					Q.push(e.to);
				}
			}	
		}
		return vis[t];
	}
	int DFS(int x,int a){
		if(x==t || a==0) return a;
		int flow=0,f;
		for(int i=cur[x];i<G[x].size();i++){
			Edge& e=edges[G[x][i]];
			if(d[x]+1==d[e.to] && (f=DFS(e.to,min(a,e.cap-e.flow)))>0){
				e.flow+=f;
				edges[G[x][i]^1].flow-=f;
				flow+=f;
				a-=f;
				if(a==0) break;
			}
		}
		return flow;
	}
	int Maxflow(int s,int t){
		this->s=s; this->t=t;
		int flow=0;
		while(BFS()){
			memset(cur,0,sizeof(cur));
			flow+=DFS(s,inf);
		}
		return flow;
	}
}g;
vector<int>ans[maxn];
void dfs(int len,int x){
	if(x==0) return;
	x-=n;
	ans[len].push_back(x);
	for(int i=0;i<g.G[x].size();i++){
		if(g.edges[g.G[x][i]].flow<0){
			dfs(len,g.edges[g.G[x][i]].to);
			break;
		}
	}
}
int main(){
//	freopen("input.txt","r",stdin);
	int S=0,T=500,T2=1000;
	g.ClearAll(maxn);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
	scanf("%d",&m);
	for(int i=1;i<=m;i++) scanf("%d",&b[i]);
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(a[j].y>=b[i]) g.AddEdge(j+n,T+i,1);
		}
	}
	for(int i=1;i<=m;i++) g.AddEdge(T+i,T2,1);
	for(int i=1;i<=n;i++){
		if(a[i].x==0) g.AddEdge(S,i,1);
		g.AddEdge(i,i+n,1);
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(i==j) continue;
			if(a[i].y>=a[j].x) g.AddEdge(i+n,j,1);
		}
	}
	int re=g.Maxflow(S,T2);
	if(re!=m) puts("impossible");
	else{
		for(int i=1;i<=m;i++){
			for(int j=0;j<g.G[T+i].size();j++){
				if(g.edges[g.G[T+i][j]].flow<0){
					dfs(i,g.edges[g.G[T+i][j]].to);
				}
			}
		}
		for(int i=1;i<=m;i++){
			for(int j=ans[i].size()-1;j>=0;j--){
				if(j==0) printf("%d
",ans[i][j]);
				else printf("%d ",ans[i][j]);
			}
		}
	}
	return 0;
}

L

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

const int maxn = 1e6+5;

struct node{
	int x,y,h;
	ll d;
	void in(){
		scanf("%d%d",&x,&y);
	}
}v[maxn],O;
int n;
int S[maxn];

int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}

bool cmp(node A,node B){
	if(A.x==B.x){
		if(A.y==B.y){
			return A.d<B.d;
		}
		return A.y<B.y;
	}
	return A.x<B.x;
}

int main(){
	//freopen("in.txt","r",stdin);
	O.in();
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		v[i].in();scanf("%d",&v[i].h);
		v[i].x-=O.x;v[i].y-=O.y;
		v[i].d=(ll)((ll)v[i].x*v[i].x+(ll)v[i].y*v[i].y);
		int G=gcd(abs(v[i].x),abs(v[i].y));
		v[i].x/=G;v[i].y/=G;
	}
	sort(v+1,v+1+n,cmp);
	int lst;
	int res = 0;
	for(int i=1;i<=n;i=lst+1){
		lst=i;
		while(lst<n&&v[lst+1].x==v[lst].x&&v[lst+1].y==v[lst].y) lst++;
		int top=0;
		for(int j=i;j<=lst;j++){
			if(top==0||v[j].h>S[top]){
				S[++top]=v[j].h;
			} else {
				int l=1,r=top,id;
				while(l<=r){
					int mid=(l+r)/2;
					if(S[mid]>=v[j].h){
						r=mid-1;
						id=mid;
					} else {
						l=mid+1;
					}
				}
				S[id]=v[j].h;
			}
		}
		res += top;
	}
	cout<<res<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/foreignbill/p/7822449.html