Codeforces Round #318(Div. 2)(A,B,C,D)

A题:
题目地址:Bear and Elections
题意:最少变换多少次可以使得第一个数字大于后面所有数字。
思路:把后面n-1个数排序,让第一个和最后一个数比较,然后增减。知道第一个数大于最后一个数为止

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
int a[110];
int main()
{
    int n;
    int cnt;
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        cnt=0;
        while(1){
            sort(a+1,a+n);
            if(a[0]<=a[n-1]){
                a[0]++;
                a[n-1]--;
                cnt++;
            }
            else
                break;
        }
        printf("%d\n",cnt);
    }
    return 0;
}

B题:
题目地址:Bear and Three Musketeers
题意:给你一个图然后判断是否能构成三角形,如果能,输出最小的点数三角形,如果不能输出-1

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=4010;
int vis[Maxn][Maxn];
int deg[Maxn];
int main()
{
    int n,m;
    int x,y;
    while(~scanf("%d %d",&n,&m)){
        memset(vis,0,sizeof(vis));
        memset(deg,0,sizeof(deg));
        while(m--){
            scanf("%d %d",&x,&y);
            deg[x]++;
            deg[y]++;
            vis[x][y]=vis[y][x]=1;
        }
        int Min=inf;
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                if(vis[i][j]){
                    for(int k=j+1;k<=n;k++){
                        if(vis[k][j]&&vis[k][i]){
                            Min=min(Min,deg[i]+deg[j]+deg[k]-6);
                        }
                    }
                }
            }
        }
        if(Min==inf)
            puts("-1");
        else
            printf("%d\n",Min);
    }
    return 0;
}

C题:
题目地址:Bear and Poker
题意:一个长度为n的数组,每个数可以变成自身的2或3倍,问你能否将这n个数变为一个数。
思路:将每个数除以2和3,直到没有2和3的质因子,然后加到set中,如果set中最后只剩下一个数那么就可以,否则就不可以。

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=1e5+10;
set<int >q;
int main()
{
    int n,x;
    while(~scanf("%d",&n)) {
        while(n--){
        scanf("%d",&x);
        while(x%2==0) x/=2;
        while(x%3==0) x/=3;
        q.insert(x);
        }
        if(q.size()==1)
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}

D题:
题目地址:Bear and Blocks
题意:给出一排序列,每次将外层的方块去掉,问总共最少要多少步。
思路:从前往后找到每一个的最少步数,从后往前找到每一个的最小步数,然后从后往前找每一个的最小步数,然后两个比较找当前最小。然后找所有的里面最大的(因为要满足所有的情况)

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <set>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;
const int Maxn=1e5+10;
int h[Maxn];
int dp1[Maxn],dp2[Maxn];
int res[Maxn];
int main()
{
    int n;
    while(~scanf("%d",&n)){
        for(int i=0;i<n;i++)
            scanf("%d",&h[i]);
        dp1[0]=1;
        for(int i=1;i<n;i++)
            dp1[i]=min(dp1[i-1]+1,h[i]);
        dp2[n-1]=1;
        for(int i=n-2;i>=0;i--)
            dp2[i]=min(dp2[i+1]+1,h[i]);
        for(int i=0;i<n;i++){
            res[i]=min(dp1[i],dp2[i]);
        }
        sort(res,res+n);
        printf("%d\n",res[n-1]);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rocky0429

一块也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值