码迷,mamicode.com
首页 > 其他好文 > 详细

2020年浙江理工大学校赛同步赛

时间:2020-06-23 12:53:51      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:题意   acm   sort   区间   wol   初始   cow   turn   har   

题目
A题意:定义一个自然数,若它的质因数至少是两重的,则称为漂亮数,若相邻两个自然数都是“漂亮数”, 就称它们为“孪生漂亮数”。输出[n,m]区间所有孪生漂亮数。
解法:类似质因数分解,如果存在某一质因数判断该质因数是否是两个以上。

int n , m ;

bool eluer(int x){
    rep(i , 2 , sqrt(x)){
        if(x % i == 0){
            int cnt = 0 ;
            while(x % i == 0){
                x /= i ;
                cnt++;
            }
            if(cnt == 1) return false;
        }
    }
    if(x > 1) return false;
    return true;
}

void solve(){
    scanf("%lld%lld" , &n , &m);
    vector<int>a;
    rep(i , n , m){
        if(eluer(i)){
            a.pb(i);
        }
    }
    int flag = 0 ;
    for(int i = 1 ; i < size(a) ; i++){
        if(a[i] - a[i-1] == 1){
            flag = 1 ;
            cout << a[i-1] << " " << a[i] << endl;
        }
    }
    if(!flag){
        cout << "no find" << endl;
    }
}

C题意:模拟。

const int N = 4e2+9;
const int maxn = 29;
int t , n , m ;
struct grid{
    int t , d ;//土地类型和土壤时间
}g[maxn][maxn];
int sl , wl;//羊和狼的数量
struct Sheep{
    int x , y , d , l;//羊的坐标、饥饿度,是否存活
}s[N];
struct Wolf{
    int x , y , d , l;//同上
}w[N];

void cow(){//土壤长草
    rep(i , 1 , n){
        rep(j , 1 , m){
            if(g[i][j].t == 3){//土壤类型
                g[i][j].d++;
                if(g[i][j].d > 3){//坑点1:三天后长草
                    g[i][j].t = 2 ;
                }
            }
        }
    }
}
void sw_move(){//羊移动、狼移动
    rep(i , 1 , sl){
        if(s[i].l == 1){//存活的羊
            s[i].x++;
            if(s[i].x == n+1) s[i].x = 1 ;
            s[i].d++;//羊饥饿度增加
        }
    }
    rep(i , 1 , wl){
        if(w[i].l == 1){//存活的狼
            w[i].y++;
            if(w[i].y == m+1) w[i].y = 1 ;
            w[i].d++;//狼的饥饿度增加
        }
    }
}

void eatsheep(){//羊吃狼
    rep(i , 1 , sl){
        rep(j , 1 , wl){
            if(s[i].l == 1 && w[j].l == 1 && s[i].x == w[j].x && s[i].y == w[j].y){//羊和狼位于同一土壤
                s[i].l = 0 ;//狼吃羊
                g[s[i].x][s[i].y].t = 1 ;//该地变为残骸
                w[j].d = 0 ;
            }
        }
    }
    rep(i , 1 , wl){
        if(w[i].l == 1){
            if(w[i].d>=10){//狼饿死
                w[i].l = 0 ;
                g[w[i].x][w[i].y].t = 1 ;
            }
        }
    }
}

void eatcow(){//羊吃草
    rep(i , 1 , sl){
        if(s[i].l == 1){
            int x = s[i].x , y = s[i].y ;
            if(g[x][y].t == 2){//羊吃草
                s[i].d = 0 ;
                g[x][y].t = 3 ;
                g[x][y].d = 0;
            }else{
                if(s[i].d >= 5){//羊饿死
                    s[i].l = 0 ;
                    g[x][y].t = 1 ;
                }
            }
        }
    }
}
void turn(){//坑点2
    rep(i , 1 , n){
        rep(j , 1 , m){
            if(g[i][j].t == 3 && g[i][j].d >= 3){//T天后土壤状态是否长草
                g[i][j].t = 2;
            }
        }
    }
}

void solve(){
     scanf("%lld%lld%lld" , &t , &n , &m);
     rep(i , 1 , n){
         rep(j , 1 , m){
             char c ;
             cin >> c;
             g[i][j].t = 3 , g[i][j].d = 0 ;//初始都为土壤
             if(c == ‘S‘){
                 s[++sl].x = i , s[sl].y = j , s[sl].d = 0 , s[sl].l = 1;
             }else if(c == ‘W‘){
                 w[++wl].x = i , w[wl].y = j , w[wl].d = 0 , w[wl].l = 1;
             }
         }
     }
     rep(i , 1 , t){
         cow();
         sw_move();
         eatsheep();
         eatcow();
     }
     turn();
     set<pii>sh , wo;
     rep(i , 1 , sl){//记录存活的羊的坐标
         if(s[i].l == 1){
             sh.insert(mp(s[i].x , s[i].y));
         }
     }
     rep(i, 1 , wl){//记录存活的狼的坐标
         if(w[i].l == 1){
             wo.insert(mp(w[i].x , w[i].y));
         }
     }
     rep(i , 1 , n){
         rep(j , 1 , m){
             if(sh.count(mp(i , j))){//该坐标存在羊
                 printf("S");
             }else if(wo.count(mp(i , j))){//该坐标存在狼
                 printf("W");
             }else if(g[i][j].t == 1){
                 printf("*");
             }else if(g[i][j].t == 2){
                 printf("#");
             }else{
                 printf(".");
             }
         }
         printf("\n");
     }
}

D题意:在一条直线上给出n个摊位的坐标,要使的任意两个摊位的坐标距离正好是k米,问摊位最少移动距离为多少。
解法:中位数原理,所有摊位向中位数靠拢。

int n , m ;
void solve(){
    int n , k ;
    scanf("%lld%lld" , &n , &k);
    vector<int>a(n);
    rep(i , 0 , n-1){
        cin >> a[i];
    }
    sort(all(a));
    int mid = size(a)/2;
    int t = mid-1 , d = a[mid]-k , sum = 0;//摊位下标,该摊位该去的位置
    while(t>=0){
        sum += abs(d-a[t]);
        d -= k ;
        t--;
    }
    t = mid + 1 , d = a[mid]+k ;
    while(t < size(a)){
        sum += abs(d-a[t]);
        d += k ;
        t++;
    }
    cout << sum << endl;
}

2020年浙江理工大学校赛同步赛

标签:题意   acm   sort   区间   wol   初始   cow   turn   har   

原文地址:https://www.cnblogs.com/nonames/p/13181482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!