SCU集训队第四次周赛

A题(hdu2600 war):

用数组记录标记即可,开始不知道是多组数据以为是Coderforces的题数wa,以后周赛还是都写成多数据吧也好调试,然而多数据就要多注意初始化了。罗大神一直挂在名字可能有多个单词。

我这种开数组模拟的方法如果数据再大点就会ML,最好把开始和结尾存到一个结构体数组中,以终点为标准来结构体排序(如果终点相同起点小的靠前),然后从数组的最右边开始扫,如果第一个数都终点小于边界直接数组b,否则输出扫到的第一个,起点大于上一个终点的情况,扫完了都没有就输出Badly!。

#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream> //hdu 1544,
using namespace std;
typedef long long int LL;
const int M = 6000000, INF = 0x3fffffff;
bool str[12000009];

int main(void) {
    int n , l, r;
    string s;
l1:   while(cin >> n) {
        cin >> l >> r;
        memset(str,0,sizeof(str));
        while(n--) {
            int a, b;
            cin >> a >> b ;
            while(getchar() != ‘\n‘);
            for(int i = a + M; i  <= b + M; i++) str[i] = 1;
        }
        for(int i = r + M; i >= l + M; i--) {
            if(!str[i]) {
                cout << i - M << endl;
                goto l1;
            }
        }
        cout << "Badly!" << endl;
    }
    return 0;
}

B题(Pasha Maximizes && Coderforces 435B && 贪心模拟):

贪心思路:从最高位开始,每一次操作尽可能把最高位的数字变得最大,一直到操作步数走完,或者数已经达到最大。

模拟题最容易遗漏一些情况导致wa,比赛的时候往往比较心急,应该先写好代码,再复查一遍再交。

#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream> //hdu 1544,
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;

char str[21];
int n, p, k;

bool doit(void) {
    int log = 0, key = -1;
    for(int i = p; i <= min(n - 1, p + k); i++) {
        if(str[i] - ‘0‘ > key) {
            key = str[i] - ‘0‘;
            log = i;
        }
    }
    while(log > p) {
        swap(str[log], str[log-1]);
        log--;
        k--;
    }
    p++;
    if(k <= 0 || p >= n - 1) return false;
    else return true;
}

int main(void) {
    cin >> str >> k;
    n = strlen(str);
    while(true) if(!doit()) break;
    printf("%s\n", str);
    return 0;
}

C题(水模拟):

#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream> //hdu 1544,
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;

int n, str[M];

int main(void) {
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> str[i];
    int first = 1, second  = 1, ok = 0, ans = 1;
    str[n + 1] =  INF;
    for(int i = 1; i <= n; i++) {
        if(str[i + 1] < str[i]) {
            first = i;
            for(; i <= n; i++) {
                if(str[i + 1] > str[i]){
                    second = i;
                    ok = 1;
                    goto l1;
                }
            }
        }
    }
l1: for(int i = first, j = second; i < j; i++, j--)
        swap(str[i], str[j]);
    for(int i = 1; i < n; i++) {
        if(str[i] > str[i+1]) ans = 0;
    }
    if(ans) cout << "yes" << endl << first << " " << second << endl;
    else cout << "no" << endl;
    return 0;
}

D题(Boredom && Codeforces 455 A && dp):

不知道比赛的时候哪里来的想法,竟然用map来存,这个又不需要查找,直接用数组存就好了。注意的是要用long long(读题的时候就该注意到这点)。

思路:用一个a[M]数组来记录,每个数对应的个数,然后类似于01背包来选择选或者不选当前物品,定义dp[i]为前i物品的最大价值,相当于加了一个限制条件的01背包,有以下转移方程:

if(a[n] - an[n - 1] > 1) dp[i] = dp[i - 1] + i * a[i];
else dp[i] = max(dp[i - 1], dp[i - 2] + i * a[i]);
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream> //hdu 1544,
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;

int n;
map<LL, LL> m;
map<LL, LL>::iterator it,ite;
LL dp[M];

int main(void) {
    while(cin >> n) {
        m.clear();
        memset(dp,0,sizeof(dp));
        for(int i = 1; i <= n; i++) {
            LL x;
            cin >> x;
            if(m.count(x)) m[x]++;
            else m[x] = 1;
        }
        it = m.begin();
        int i;
        for(i = 3;it != m.end(); it++, i++) {
            ite=it;
            ite--;
            if((it -> first) - (ite -> first) > 1) dp[i] = dp[i - 1] + (it -> first) * (it -> second);
            else dp[i] = max(dp[i - 2] + (it -> first) * (it -> second), dp[i - 1]);
        }
        LL ans = 0;
        for(int i = 1; i < M; i++) if(dp[i] > ans) ans = dp[i];
        cout << ans << endl;
    }
    return 0;
}

E题(Little Pony and Sort by Shift && Codeforces 454B && 模拟):

简单题,只需找到那个唯一一个不满足要求的断点即可,如果这类型断点个数超过一个就没有办法,如果为0,直接输出,为1就看距离最右边的距离就是步数。

#include <queue>
#include <set>
#include <map>
#include <stack>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream> //hdu 1544,
using namespace std;
typedef long long int LL;
const int M = 100009,INF = 0x3fffffff;

int str[M], step, n;

int  ok(void) {
    int aa = 0;
    for(int i = 1; i <= n; i++) {
        int j = i + 1;
        if(j > n) j = 1;
        if(str[i] > str[j]) aa++;
        if(aa > 1) return aa;
    }
    return aa;
}

int main(void) {
    while(cin >> n) {
        for(int i = 1; i <= n; i++) {cin >> str[i]; str[n + i] = str[i];}
        int x = ok();
        if(!x) cout << x << endl;
        else if(x > 1) cout << -1 << endl;
        else {
            int i;
            for(i = 1; i <= n; i++) {
                int j = i + 1;
                if(j > n) j = 1;
                if(str[i] > str[j]) break;
            }
            cout << n - i << endl;
        }

    }
    return 0;
}
时间: 2024-10-15 00:07:40

SCU集训队第四次周赛的相关文章

SCU集训队第三次周赛记录

A题(Win or Freeze)(博弈&数论): 题目大意:对于1个数q,a和b两个人参与游戏,每一轮只能把q分解成q的所有因子中(且当一个人来分的时候他用的是最优决策),不是1和本身的因子,当其中一个人面对的数无法再被分解的时候该人获胜. 数论知识补充: 算术基本定理:一个大于x的自然数能被唯一确定的分解为有限个质数的乘积: x=pa11pa22pa33...pann 这些质数都是这个数的质因子,且质数的质因子就是它本身. 解题思路: 1.考虑到q为1或质数是,显然a获胜,直接打印1,0.

SWPU-ACM集训队周赛之组队赛(3-11)G题题解

点这里去做题 水水水水水,不难发现如下表 t 1 2 3 4 v 1 3 5 7 s 1 4 9 16 明显s=t*t 题目中对10000取模即取后四位,即对1000取余 #include<stdio.h> int main() { long long v,T,t,s; scanf("%lld",&T); while(T--) { scanf("%lld",&t); s=t*t; s=s%10000; printf("%lld\

SWPU-ACM集训队周赛之组队赛(3-11) C题题解

点这里去看题 模拟,注意细节 #include<stdio.h> #include<string.h> int main() { int T,n,i,j,ct,q[1010]; //q[]储存正负信息 scanf("%d",&T); while(T--) { char a[1010],b[1010]; memset(q,0,sizeof(q)); scanf("%d",&n); getchar(); //读掉回车(换行符) f

SWPU-ACM集训队周赛之组队赛(3-11) E题题解

点这里去做题 %*c  读入时跳过一位,本题中即跳过"-"; #include<stdio.h> int run(int x) //判断闰年 { int f=0; if(x%4==0&&x%100!=0) f=1; if(x%400==0) f=1; return f; } int main() { int y,m,d,sum=0,i,j,k,day=0; int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; sc

国家集训队2011 happiness

[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值.作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大. [输入格式] 第一行两个正整数n,m.接下来是六个矩阵第一个矩阵为n行m列 此矩阵的第i行第j列的数字表示座位在第i行第j列的同学

腾讯课堂目标2017初中数学联赛集训队作业题解答-11

课程链接:目标2017初中数学联赛集训队-1(赵胤授课) 1. 证明: 当素数 $p\ge7$ 时, $p^4 - 1$ 可被 $240$ 整除. 解答: $$p^4 - 1 = (p^2 + 1)(p + 1)(p - 1)$$ $$\Rightarrow \begin{cases}24\ \big{|}\ (p+1)(p-1)\\10\ \big{|}\ p^4 - 1\end{cases} \Rightarrow 240\ \big{|}\ p^4 - 1.$$ 注: $10\ \big{

周赛2(星期三之前补题完)

本厂做了3个水体,被略哭 水题1  暴力乱搞 题目: 回文数猜想 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4433    Accepted Submission(s): 2638 Problem Description 一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正

国家集训队2011]happiness(吴确)

1873. [国家集训队2011]happiness(吴确) ★★★   输入文件:nt2011_happiness.in   输出文件:nt2011_happiness.out   简单对比时间限制:1 s   内存限制:512 MB [试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,

2015 年 JXNU_ACS 算法组寒假第二次周赛

2015 年 JXNU_ACS 算法组寒假第二次周赛 比赛链接:http://acm.hdu.edu.cn/diy/contest_show.php?cid=26246 Start Time : 2015-02-01 13:00:00 End Time : 2015-02-01 17:30:00 终榜:http://acm.hdu.edu.cn/diy/contest_ranklist.php?cid=26246&page=1 这次比赛考查的知识都很基础,甚至还有几道就是C语言基础(比如1006