现在的位置: 首页 > 综合 > 正文

20131002组队赛-Regionals 2011, North America – Rocky Mountain

2013年08月27日 ⁄ 综合 ⁄ 共 8764字 ⁄ 字号 评论关闭

A. Iterated Difference

 

A题是水题,刚开始一直没看懂,英语拙计。就是给你一个数组,判断数组中的每一个数字是否相同。如果不同则按照

a[k] = a[k]-a[k+1]来更换数组,当达到目标状态时经过了几次变换。如果变换次数超过1000次还没有达到状态时,就

输出“not attained”。就是模拟着写就成:

 

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

int QuickMod(int  a,int b,int n)
{
    int r = 1;
    while(b)
    {
        if(b&1)
            r = (r*a)%n;
        a = (a*a)%n;
        b >>= 1;
    }
    return r;
}
#define maxn 50
int n;
int ans;
int num[maxn];
int solve()
{
    while(1)
    {
        int flag = 0;
        if(ans > 1000)
            return -1;
        for(int i = 0; i < n-1; ++i)
        {
            if(num[i]!=num[i+1])
            {
                flag = 1;
                break;
            }
        }
        if(flag == 1)
        {
            ans++;
            int tp = num[0];
            for(int i = 0; i < n-1; ++i)
                num[i] = abs(num[i] - num[i+1]);
            num[n-1] = abs(num[n-1] - tp);
        }
        else
            break;
    }
    return ans;
}
int main()
{
    int cnt = 0;
    while(scanf("%d", &n) && n)
    {
        mem(num, 0);
        cnt++;
        for(int i = 0; i < n; ++i)
            scanf("%d", &num[i]);
        ans = 0;
        int app = solve();
        printf("Case %d: ", cnt);
        if(app == -1)
            printf("not attained\n");
        else
            printf("%d iterations\n", app);
    }
    return 0;
}

C. Stock Prices

 

C题也是签到,排序的问题。只不过对于求前k1小的时候需要对天数按照升序排列,求前k2大的时候反之。比赛中

judge error了,在外面交的。就是排序即可:

 

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
#define maxn 1000001
struct node
{
    int day;
    int price;
} num[maxn];

bool cmp(node a, node b)
{
    if(a.price == b.price)
        return a.day < b.day;
    return a.price < b.price;
}

bool cmp1(node a, node b)
{
    if(a.price == b.price)
        return a.day > b.day;
    return a.price > b.price;
}

int baocun1[maxn];
int baocun2[maxn];
bool cmpp(int a, int b)
{
    return a > b;
}
int main()
{
    int n, k1, k2;
    int cnt = 0;
    while(scanf("%d%d%d", &n, &k1, &k2))
    {
        if(n == 0 && k1 == 0 && k2 == 0)
            break;
        cnt++;
        memset(num, 0, sizeof(num));

        for(int i = 0; i < n; ++i)
        {
            scanf("%d", &num[i].price);
            num[i].day = i+1;
        }
        printf("Case %d\n", cnt);
        memset(baocun1, 0, sizeof(baocun1));
        memset(baocun2, 0, sizeof(baocun2));
        int con1 = 0, con2 = 0;
        sort(num, num+n, cmp);

        for(int i = 0; i < k1; ++i)
            baocun1[con1++] = num[i].day;

        sort(num, num+n, cmp1);
        for(int i = 0; i < k2 ; ++i)
            baocun2[con2++] = num[i].day;

        sort(baocun1, baocun1+con1);
        sort(baocun2, baocun2+con2, cmpp);

        for(int i = 0; i < con1; ++i)
        {
            if(i == 0)
                printf("%d", baocun1[i]);
            else
                printf(" %d", baocun1[i]);
        }
        printf("\n");
        for(int i = 0; i < con2; ++i)
        {
            if(i == 0)
                printf("%d", baocun2[i]);
            else
                printf(" %d", baocun2[i]);
        }
        printf("\n");
    }
    return 0;
}

E. Pills

 

E题:卡特兰数(卡特兰数百科)。就是意思是说,对于N棵药,每次吃药时随机从药瓶中拿出一颗,如果拿出的是整

颗那么就掰一半,把剩余的一半扔回药瓶。问你对于这样的吃药方式,有多少种方法可以吃完药。神奇的数论...

 

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
long long C[63][63];
long long A[63];
void init()
{
    C[0][0] = 1;
    C[1][1] = 1;
    for(int i = 2; i <= 62; ++i)
    {
        C[i][0] = 1;
        C[i][i] = 1;
        C[i][1] = i;
        for(int j = 2; j <= i; ++j)
            C[i][j] = C[i-1][j] + C[i-1][j-1];
    }
}
int main()
{
    init();
    long long n;
    while(scanf("%lld",&n))
    {
        if(n==0)
            break;
        //cout << C[2*n][n] << endl;
        printf("%lld\n", C[2*n][n]/(n+1));
    }
    return 0;
}

 

G. User Names

 

刚刚做了快2个多小时了,WAWAWA,选择从后面找的方法后就A了。我觉得就是neme的格式的关系了。从后

面找的话找到第一个空格的话那么肯定找到的是lasr name但是要是从前面开始找的话就不一定了。WA和A

C代码就这里不一样..

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
char str[100];
string ans;
int n, m;
map<string, int> Q;
int main()
{
    int cas = 0;
    while(scanf("%d%d", &n, &m))
    {
        cas++;
        if(!n && !m)
            break;
        getchar();
        Q.clear();
        printf("Case %d\n", cas);
        int cnt = 0;
        mem(str, 0);
        while(n--)
        {
            gets(str);
            ans = "";
            int len = strlen(str);
            //int st1 = 0, st2 = 0;
            for(int lp = 0; lp < len; ++lp)
            {
                if(str[lp] >= 'A' && str[lp] <= 'Z')
                {
                    ans+= (str[lp] + 32);
                    break;
                }
                else if(str[lp] >= 'a' && str[lp] <= 'z')
                {
                    ans += str[lp];
                    break;
                }
            }
            int ii;
            for(ii = len-1; ii >= 0; --ii)
            {
                if(str[ii] == ' ')
                    break;
            }
            for(int i = ii+1; i < len; ++i)
            {
                if(str[i] >= 'A' && str[i] <= 'Z')
                {
                    ans+= (str[i] + 32);
                }
                else if(str[i] >= 'a' && str[i] <= 'z')
                {
                    ans += str[i];
                }
            }
//            int kong = 0;
//            for(st1 = 0; st1 < len; ++st1)
//            {
//                if(str[st1] == ' ')
//                {
//                    break;
//                }
//            }
//            int flag = 0;
//            for(st2 = st1+1; st2 < len; ++st2)
//            {
//                if(str[st2] == ' ')
//                {
//                    flag = 1;
//                    break;
//                }
//                else if(str[st2] >= 'A' && str[st2] <= 'Z')
//                {
//                    ans += (str[st2] + 32);
//                }
//                else if(str[st2] >= 'a' && str[st2] <= 'z')
//                {
//                    ans += str[st2];
//                }
//
//            }
//            if(flag == 1)
//            {
//                ans = "";
//                for(int lp = 0; lp < len; ++lp)
//                {
//                    if(str[lp] >= 'A' && str[lp] <= 'Z')
//                    {
//                        ans+= (str[lp] + 32);
//                        break;
//                    }
//                    else if(str[lp] >= 'a' && str[lp] <= 'z')
//                    {
//                        ans += str[lp];
//                        break;
//                    }
//                }
//                for(int k = st2+1; k < len; ++k)
//                {
//                    if(str[k] >= 'A' && str[k] <= 'Z')
//                    {
//                        ans += (str[k] + 32);
//                    }
//                    else if(str[k] >= 'a' && str[k] <= 'z')
//                    {
//                        ans += str[k];
//                    }
//                }
//            }
            int add = ans.length();
            if(Q[ans] == 0)
            {
                Q[ans] ++;
                if(add > m)
                {
                    for(int i = 0; i < m; ++i)
                        printf("%c", ans[i]);
                    printf("\n");
                }
                else
                    cout << ans << endl;

            }
            else
            {
                Q[ans]++;
                cnt = Q[ans] - 1;
                if(cnt <= 9)
                {
                    if(add <= m-1)
                    {
                        ans += (cnt + '0');
                        cout << ans << endl;
                    }
                    else
                    {
                        for(int i = 0; i < m-1; ++i)
                            printf("%c", ans[i]);
                        cout << cnt << endl;
                    }
                }
                else
                {
                    if(add <= m-2)
                    {
                        int shi = cnt/10;
                        int ge = cnt%10;
                        ans += (shi + '0');
                        ans += (ge + '0');
                        cout << ans << endl;
                    }
                    else if(add == m-1)
                    {
                        int shi = cnt/10;
                        int ge = cnt%10;
                        ans[m-2] = (shi + '0');
                        ans += (ge + '0');
                        cout << ans << endl;
                    }
                    else
                    {
                        for(int i = 0; i < m-2; ++i)
                            printf("%c", ans[i]);
                        cout << cnt << endl;
                    }
                }
            }
        }
    }
    return 0;
}
/*
2 6
Jenny Ax
Christos H Papadimitriou
11 8
Jean-Marie d'Arboux
Jean-Marie A d'Arboux
Jean-Marie B d'Arboux
Jean-Marie C d'Arboux
Jean-Marie D d'Arboux
Jean-Marie D d'Arboux
Jean-Marie F d'Arboux
Jean-Marie G d'Arboux
Jean-Marie H d'Arboux
Jean-Marie I d'Arboux
Jean-Marie J d'Arboux
11 9
Jean-Marie d'Arboux
Jean-Marie A d'Arboux
Jean-Marie B d'Arboux
Jean-Marie C d'Arboux
Jean-Marie D d'Arboux
Jean-Marie D d'Arboux
Jean-Marie F d'Arboux
Jean-Marie G d'Arboux
Jean-Marie H d'Arboux
Jean-Marie I d'Arboux
Jean-Marie J d'Arboux
*/

H. Citizenship Application

迷之WA,看了数据都不懂了。。。。

 

代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
#include <functional>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cassert>
#include <bitset>
#include <stack>
#include <ctime>
#include <list>
#define INF 0x7fffffff
#define max3(a,b,c) (max(a,b)>c?max(a,b):c)
#define min3(a,b,c) (min(a,b)<c?min(a,b):c)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;

struct node
{
    int year;
    int mon;
    int day;
} num[210];

int judge(int m)
{
    if(m % 400 == 0)
        return true;
    else if(m % 4 == 0)
        return true;
    return false;
}
int P[15] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30,31};
int con;
void init()
{
    for(int i = 1; i <= 12; ++i)
        con += P[i];
}
int cal(int year, int mon, int day)
{
    int sum = 0;
    for(int i = 1980; i <= year-1; ++i)
    {
        if(!judge(i))
            sum += con;
        else
            sum += (con+1);
    }
    for(int i = 1; i <= mon-1; ++i)
    {
        sum += P[i];
        if(i == 2 && judge(year))
            sum ++;
    }
    sum += day;
    return sum;
}
void solve(int &year, int &mon, int &day, int &sum)
{
    while(sum >= 0)
    {
        int flag = 0;
        if(mon <= 11)
        {
            if(judge(year) && mon == 2)
                sum -= (P[mon] + 1);
            else sum -= P[mon];
            mon++;
            if(sum < 0)
                break;
        }
        else
        {
            year++;
            mon = 1;
            sum -= 31;
            if(sum < 0)
                break;
        }
    }

    if(mon == 1)
    {
        mon = 12;
        year--;
        sum += 31;
    }
    else
    {
        mon --;
        sum += (P[mon]);
    }
    int tp;
    tp = sum - (P[mon] - day);
    if(tp > 0)
    {
        mon++;
        day = tp;
    }
    else
    {
        day += sum;
    }
}

int main()
{
    int n;
    while(scanf("%d", &num[0].mon) != EOF)
    {
        con = 0;
        init();
        scanf("/%d/%d", &num[0].day, &num[0].year);
        scanf("%d/%d/%d", &num[1].mon, &num[1].day, &num[1].year);
        int sum = 0;
        int tmp = cal(num[1].year, num[1].mon, num[1].day);
        int tmp1 = cal(num[0].year, num[0].mon, num[0].day);
        scanf("%d", &n);
        int SUM = 0;
        int span = 0;
        for(int i = 2; i < 2*n+2; i += 2)
        {
            int MAX = tmp;
            int MIN = tmp;
            scanf("%d/%d/%d", &num[i].mon, &num[i].day, &num[i].year);
            scanf("%d/%d/%d", &num[i+1].mon, &num[i+1].day, &num[i+1].year);
            int p1 = cal( num[i].year,num[i].mon, num[i].day);
            int p2 = cal(num[i+1].year,num[i+1].mon, num[i+1].day);
            if(p2 <= tmp) {
                span += p2 - p1;
            }
            else
            {
                MIN = min(tmp,p1);
                span += tmp - MIN;
                MAX = max(tmp, p1);
                SUM += (p2 - MAX);
            }
        }
        //cout << "SUM:-> " << SUM << endl;
        sum = ( tmp - tmp1 - span ) / 2;
        sum = 1095 - sum + SUM + n;
        solve(num[1].year, num[1].mon, num[1].day, sum);
        //cout << "-----------" << endl;
        printf("%d/%d/%d\n", num[1].mon, num[1].day, num[1].year);
        //cout << "-------------" <<endl;
    }
    return 0;
}

 

迷.....

 

抱歉!评论已关闭.