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\n",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\n",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\n",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\n",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\n", 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\n");
    else {
        for (int i = 1; i <= n; i++) {
            if (i != 1) printf(" ");
            printf("%d", res[i]);
        }
        printf("\n");
    }
    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\n",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)\n",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)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.z--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.z--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.x++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
            }
            if(opt==5){
                n1.x--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.z++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.z++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.x--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
            }
            if(opt==4){
                n1.x--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.y--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.y--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.x++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
            }
            if(opt==3){
                n1.x--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.y++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.y++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.x++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
            }
            if(opt==2){
                n1.y--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.x--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.x--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.y++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
            }
            if(opt==1){
                n1.y--;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.x++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.x++;
                printf("(%d %d %d) (%d %d %d)\n",n1.x,n1.y,n1.z,n2.x,n2.y,n2.z);
                n1.y--;
                printf("(%d %d %d) (%d %d %d)\n",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)\n",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]," \n"[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\n",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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值