• 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;
    }
    
  • 相关阅读:
    delphi实现FTP下载
    delphi中ClientDataSet的隐含功能
    删除注册的ODBC
    ZOJ 1041 Transmitters
    POJ 3232 Accelerator
    POJ 3460 Booksort
    UVa 11552 Fewest Flops
    SOJ 8064 Whack the Groundhog
    BNU OJ 29355 手速为王
    POJ 3322 Bloxorz I
  • 原文地址:https://www.cnblogs.com/foreignbill/p/7822449.html
Copyright © 2020-2023  润新知