Codeforces 补题 round 2 contest 915

A. Garden

思路:模拟

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))

const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;
const int N = 101;

int n,k,x;
int main(){
    while(scanf("%d%d",&n,&k)!=EOF){
        int ans = INF ;
        for(int i=0;i<n;i++){
            scanf("%d",&x);
            if(k % x == 0){
                ans = min(ans , k / x);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

B. Browser

思维题

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))

const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;
const int N = 101;

int n,pos,l,r;
int main(){
    while(scanf("%d%d%d%d",&n,&pos,&l,&r)!=EOF){
        int num1 = 0,num2 = 0;
        if(l == 1 &&r == n)cout<<"0\n";
        else if(l == 1)  cout<<abs(r - pos) + 1<<endl;
        else if(r == n) cout<< abs(l - pos) + 1<<endl;
        else {
            num1 = abs(l-pos)+abs(r-l);
            num2 = abs(r-pos)+abs(r-l);
            cout<<min(num1,num2)+2<<endl;
        }
    }
    return 0;
}

C. Permute Digits

思路: DFS

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))

const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;
const int N = 101;

char s[N],a[N];
int vis[N],b[N],res[N];
int flag,l1,l2;
void dfs(int pos,bool check){
    if(flag)    return ;
    if(pos == l1){
        flag = true ; return;
    }
    for(int i=9;i>=0;i--){
        if(vis[i]>0){
            if(check || i == b[pos]){
                vis[i] --;
                res[pos] = i;
                dfs(pos + 1,check);
                if(flag) return;
                vis[i] ++;
            }
            else if(i < b[pos]){
	            vis[i] --;
	            res[pos] = i;
	            dfs(pos+1,true);
	            if(flag) return ;
	            vis[i]++;
	        }
        }
    }
}
bool cmp(char a,char b){
    return a > b;
}
int main(){
	flag = false;
    scanf("%s %s",s,a);
   //	puts(s);puts(a);
    l1 = strlen(s);
    l2 = strlen(a);
    sort(s,s+l1,cmp);
    if(l2 > l1)	puts(s);
    else if(l2 == l1&&strcmp(s,a)<0)	puts(s);
    else{
        for(int i=0;i<l1;i++)
            vis[s[i]-'0'] ++;
        for(int i=0;i<l2;i++)
           	b[i] = a[i] - '0';
        dfs(0,false);
        for(int i=0;i<l1;i++)
            printf("%d",res[i]);
        cout<<endl;
    }
    return 0;
}

D. Almost Acyclic Graph

思路:拓扑排序

#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clr(a) memset(a,0,sizeof(a))

const int MAXN = 1e5+10;
const int INF = 0x3f3f3f3f;
const int N = 101;

int n,m;
int in[MAXN],ins[MAXN];
vector<int>g[MAXN];

bool top_sort(int x){
    for(int i=0;i<=n;i++){
        in[i] = ins[i];
    }
    int num=0;
    in[x] --;
    queue<int>q;
    for(int i=1;i<=n;i++){
        if(in[i] == 0) {
            q.push(i);
            num++;
        }
    }
    while(!q.empty()){
        int top = q.front();
        q.pop();
        for(int j=0;j<g[top].size();j++){
            if(!(--in[g[top][j]])) {
                q.push(g[top][j]);
                num++;
            }
        }
    }
    if(num == n)    return true;
    else return false;
}

int main(){
    clr(in);
    scanf("%d%d",&n,&m);
    int x,y;
    for(int i=0;i<m;i++){
        scanf("%d%d",&x,&y);
        g[x].push_back(y);
        ins[y] ++;
    }
    for(int i=1;i<=n;i++){
        if(top_sort(i)){
            puts("YES");return 0;
        }
    }
    puts("NO");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/l18339702017/article/details/81582862