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

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

时间:2015-08-30 13:01:34      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:codeforces

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]);
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:codeforces

原文地址:http://blog.csdn.net/u013486414/article/details/48103141

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