A题:

/*
*题目大意:
*        基础题,略。就是题目长,看了好久,要加强阅题速度啊。
*解题思路:
*        略。
*/
View Code
#include <iostream>
#include <cmath>
using namespace std;

const int MAXN = 305;
int main(void)
{
#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
#endif
    int n, k;
    while(scanf("%d %d", &n, &k) == 2)
    {
        int a[MAXN];
        int e = 2 * n + 1;

        for(int i = 0; i < e; i++)
            scanf("%d", &a[i]);
        int cnt = 0;
        for(int i = 1; i < e; i += 2)
        {
            int tmp = a[i] - 1;
            if(tmp > a[i - 1] && tmp > a[i + 1] && cnt < k)
            {
                //cout << "hah" << endl;
                a[i] = tmp;
                cnt++;
            }
        }
        printf("%d", a[0]);
        for(int i = 1; i < e; i++)
            printf(" %d", a[i]);
        printf("\n");
    }
    return 0;
}

B题:

/*
*题目大意:
*        略,此题比较容易看懂。
*解题思路:
*        两次贪心。求最小值一遍for,求最大值可以用优先队列。
*/
View Code
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <functional>
#include <vector>
using namespace std;

const int MAXN = 1024;
int main(void)
{
#ifndef ONLINE_JUDGE
    //freopen("in.txt", "r", stdin);
#endif
    int n, m, a[MAXN];

    while(scanf("%d %d", &n, &m) == 2)
    {
        for(int i = 0; i < m; i++)
            scanf("%d", &a[i]);
        sort(a, a + m);
        int tmp = n, Min = 0, Max = 0;

        for(int i = 0; i < m; i++)
        {
            if(a[i] < tmp)
            {
                Min += (a[i] + 1) * a[i] / 2;
                tmp -= a[i];
            }
            else
            {
                int tol = (a[i] + 1) * a[i] / 2;
                int t = a[i] - tmp;
                int re = (t + 1) * t / 2;
                Min += tol - re;
                break;
            }
        }

        priority_queue<int> Q;
        for(int i = 0; i < m; i++)
            Q.push(a[i]);
        for(int i = 0; i < n; i++)
        {
            int pre = Q.top();
            Q.pop();
            Max += pre;
            pre--;
            if(pre != 0)
                Q.push(pre);
        }
        printf("%d %d\n", Max, Min);
    }
    return 0;
}

C题:

/*
*题目大意:
*        给n个带坐标的点,一个人只能往上,下,左,右移动,求至少增加
*        几个点可以使他达到所有点。坐标点都为整型数据。
*解题思路:
*        其实很简单,先把一个点能到达的搜一遍,剩余的再增加一个点,就可以
*        到达另一个点,之后另一个点再搜一遍,如此下去。
*解题感想;
*        下午刚睡醒,脑袋糊涂了。居然没有加dfs上去。晕菜~~
*/
View Code
#include <iostream>
#include <cmath>
using namespace std;

const int MAXN = 305;

typedef struct _node
{
    int x, y;
}N;

N node[MAXN];
int vst[MAXN];

void judge(N ind, int n)
{
    for(int i = 0; i < n; i++)
    {
        if(!vst[i])
        {
            if(node[i].x == ind.x)
            {
                vst[i] = 1;
                judge(node[i], n);
            }
            if(node[i].y == ind.y)
            {
                vst[i] = 1;
                judge(node[i], n);
            }
        }
    }
}

bool isEmpty(int n)
{
    for(int i = 0; i < n; i++)
    {
        if(!vst[i])
            return false;
    }
    return true;
}

int main(void)
{
#ifndef ONLINE_JUDGE
    //freopen("in.txt", "r", stdin);
#endif

    int n;
    while(scanf("%d", &n) == 1)
    {
        memset(vst, 0, sizeof(vst));

        for(int i = 0; i < n; i++)
            scanf("%d %d", &node[i].x, &node[i].y);

        int ans = 0;

        judge(node[0], n);

        while(!isEmpty(n))
        {
            for(int i = 0; i < n; i++)
            {
                if(!vst[i])
                {
                    ans++;
                    judge(node[i], n);
                }
            }
        }
        printf("%d\n", ans);
    }
    return 0;
}

D题:

/*
*题目大意:
*        略。
*解题思路:
*        略。
*/
View Code
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> vec, ans;
int MinMis;

void get_que(int a, int b, int n)
{
    vec.clear();
    bool flag;
    if(!a)
        flag = true;
    else
        flag = false;
    while(a > 0 && b > 0)
    {
        if(a > b)
        {
            a -= b;
            vec.push_back(0);//0是B,1是T
        }
        else
        {
            b -= a;
            vec.push_back(1);
        }
        if(b == 0)
        {
            if(a != 1)
                flag = true;//不满足
            break;
        }
    }

    if(!flag && vec.size() == n)
    {
        int mis = 0;
        for(unsigned i = 0; i < vec.size() - 1; i++)
        {
            if(vec[i] == vec[i + 1])
                mis++;
        }
        if(mis < MinMis)
        {
            MinMis = mis;
            ans = vec;
        }
    }
}

void init()
{
    MinMis = INT_MAX;
    ans.clear();
}

int main(void)
{
#ifndef ONLINE_JUDGE
    //freopen("in.txt", "r", stdin);
#endif
    int n, r;
    while(scanf("%d %d", &n, &r) == 2)
    {
        init();
        for(int i = 0; i <= r; i++)
        {
            get_que(i, r, n);
            get_que(r, i, n);
        }

        if(MinMis == INT_MAX)
            printf("IMPOSSIBLE\n");
        else
        {
            printf("%d\n", MinMis);
            reverse(ans.begin(), ans.end());
            for(unsigned i = 0; i < ans.size(); i++)
            {
                if(ans[i] == 1)
                    printf("T");
                else
                    printf("B");
            }
            printf("\n");
        }
    }
    return 0;
}
posted on 2012-08-19 01:18  cchun  阅读(215)  评论(0编辑  收藏  举报