【组队训练】2014北京区域赛

四题,排名107,铜尾。。。。

发挥还真是稳定阿。。。。

这场队友终于给力了,我怂了。。。。QAQ

A 水题,10min 1A

K 水题,28min 2A 还是需要一点点想法的。我傻逼了,错了一次……

#include <cstdio>
const int maxn = 3e6 + 10;
int T,n;
int a[maxn];
int main() {
    //freopen("in.txt","r",stdin);
    scanf("%d", &T);
    int cas = 0;
    while(T--){
        scanf("%d",&n);
        for(int i = 1;i <= n; i++) scanf("%d", a+i);
        int mi = a[n], ans = 0;
        for (int i = n-1; i >= 1; --i)
            if (mi < a[i]) ++ans;
            else mi = a[i];
        printf("Case #%d: %d\n", ++cas, ans);
    }
    return 0;
}

H 水dp 1h14min 2A

dp[i][j]表示前i个数的答案 dp[j^a[i]] = dp[i-1][j] + dp[i-1][j^a[i]]

MLE一次,其实我想到了可能会爆内存,偷懒了。。。。非要mle再改滚动数组。。。。

#include <cstdio>
#include <cstring>
typedef long long ll;
const int maxn = 210;
using namespace std;
int T,n,m;
const int st = (1<<21);
int a[50];
ll dp[2][st+10];
int main() {
    freopen("in.txt","r",stdin);
    scanf("%d", &T);
    int cas = 0;
    while(T--){
        scanf("%d%d",&n, &m);
        for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
        memset(dp, 0, sizeof dp);
        dp[0][0] = 1;
        int now = 1;
        for (int i = 1; i <= n; ++i) {
            for (int j = 0; j <= st; ++j) dp[now][j] = 0;
            for (int j = 0; j < st; ++j)
                dp[now][j^a[i]] += dp[now^1][j^a[i]] + dp[now^1][j];
            now ^= 1;
        }
        now ^= 1;
        ll ans = 0;
        for (int i = m; i <= st; ++i) ans += dp[now][i];
        printf("Case #%d: %lld\n", ++cas, ans);
    }
    return 0;
}

I 简单计算几何

求两个圆相交的面积和简单的容斥思想吧。不过面积交挺麻烦的,队友wa了好几次,以至于最后A了让我感觉超惊喜。。

这时还不到三个小时,可是后面就比较惨了,一道题没做出来

------

B题,看到数据范围我就说——傻逼暴力加剪枝

然后我就是很傻逼。。。没想到怎么剪枝。。。。

马丹。。。。我觉得我dfs已经无力了。。。。

和ys讨论 一致认为n*m+1<maxn就输出NO,然后我就在那构造,构造了半天也没对。。。。

结果赛后查题解发现剪枝就是这个条件。。。蠢阿!!!

#include <cstdio>
using namespace std;

int c[30], a[30][30];
int n, m, k;

bool check(int x, int y, int v) {
    if (x>1 && a[x-1][y] == v) return false;
    if (y>1 && a[x][y-1] == v) return false;
    return true;
}

bool dfs(int x, int y, int rest) {
    for (int i = 1; i <= k; ++i) if (c[i] * 2 > rest + 1) return false;
    if (y == m+1) x++, y = 1;
    if (rest == 0) {
        puts("YES");
        for (int i = 1; i <= n; ++i)
            for (int j = 1; j <= m; ++j)
                printf("%d%c", a[i][j], j==m?‘\n‘:‘ ‘);
        return true;
    }
    for (int i = 1; i <= k; ++i) {
        if (c[i]) {
            c[i]--; a[x][y] = i;
            if (check(x, y, i) && dfs(x, y+1, rest-1)) return true;
            c[i]++;
        }
    }
    return false;
}

int main() {
    //freopen("in.txt","r",stdin);
    int T;
    scanf("%d", &T);
    int cas = 1;
    while(T--){
        printf("Case #%d:\n", cas++);
        scanf("%d%d%d",&n, &m, &k);
        for (int i = 1; i <= k; ++i) scanf("%d", &c[i]);
        if (!dfs(1, 1, n*m)) puts("NO");
    }
    return 0;
}

D题,一眼就是区间dp,因为数据范围n^3刚刚好,描述也比较像区间dp

恩。。。想和几种状态方程没想明白。。。zr后来都开始在那里贪心了 = =。。

讲道理虽然区间dp很显然,但是转移方程还是有点难的= =但是几个小时还是应该想出来的。。。啊。。。。

dp[i][j]表示区间i~j所需的最小伤害

转移时枚举最后一个打死的狼就好了阿。。。

果然我傻逼= =

#include <cstdio>
#include <cstring>
#include <algorithm>
const int N = 210;
using namespace std;
int T,n;
int a[N], b[N];
int dp[N][N];

inline void scan(int &ret) {
    char c; ret=0;
    while((c=getchar())<‘0‘||c>‘9‘);
    while(c>=‘0‘&&c<=‘9‘) ret=ret*10+(c-‘0‘),c=getchar();
}
inline void mi(int &x, int y) { if(y<x) x=y; }

int main() {
    //freopen("in.txt", "r", stdin);
    scanf("%d", &T);
    int cas = 0;
    while(T--){
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i) scan(a[i]);
        for (int i = 1; i <= n; ++i) scan(b[i]); b[n+1] = 0;

        for (int i = 1; i <= n; ++i)
            dp[i][i] = a[i] + b[i-1] + b[i+1];
        for (int k = 1; k < n; ++k) {
            for (int l = 1; l+k <= n; ++l) {
                int r = l + k;
                dp[l][r] = min(a[l]+dp[l+1][r], a[r]+dp[l][r-1]);
                for (int last = l+1; last < r; ++last)
                    mi(dp[l][r], dp[l][last-1]+dp[last+1][r]+a[last]);
                dp[l][r] += b[l-1] + b[r+1];
            }
        }
        printf("Case #%d: %d\n", ++cas, dp[1][n]);
    }
    return 0;
}

还差的远呢。。。

时间: 2024-10-17 14:01:16

【组队训练】2014北京区域赛的相关文章

HDU 5122 K.Bro Sorting(2014北京区域赛现场赛K题 模拟)

这题定义了一种新的排序算法,就是把一串序列中的一个数,如果它右边的数比它小 则可以往右边移动,直到它右边的数字比它大为止. 易得,如果来模拟就是O(n^2)的效率,肯定不行 想了一想,这个问题可以被转化成 求这一串序列当中每个元素,它的右边是否存在小于它的数字,如果存在,则++ans 一开始没想到诶= = 不应该不应该 1 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler 2 #include <std

hdu 5112 (2014北京区域赛 A题)

给出某个时刻对应的速度 求出相邻时刻的平均速度 输出最大值 Sample Input23 // n2 2 //t v1 13 430 31 52 0 Sample OutputCase #1: 2.00Case #2: 5.00 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <string>

hdu 5122 (2014北京区域赛 K题)

把一个序列按从小到大排序 要执行多少次操作 只需要从右往左统计,并且不断更新最小值,若当前数为最小值,则将最小值更新为当前数,否则sum+1 Sample Input255 4 3 2 155 1 2 3 4 Sample OutputCase #1: 4Case #2: 1 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5

HDU 5119 Happy Matt Friends(2014北京区域赛现场赛H题 裸背包DP)

虽然是一道还是算简单的DP,甚至不用滚动数组也能AC,数据量不算很大. 对于N个数,每个数只存在两个状态,取 和 不取. 容易得出状态转移方程: dp[i][j] = dp[i - 1][j ^ a[i]] + dp[i - 1][j]; dp[i][j] 的意思是,对于数列 中前 i 个数字,使得 XOR 和恰好为 j 的方案数 状态转移方程中的 dp[i - 1][j] 即表示当前这个数字不取, dp[i - 1][j ^ a[i]] 表示当前这个数字要取. 这道题还是要好好理解阿! sou

15北京区域赛——A 二分——hihoCoder 1249 Xiongnu&#39;s Land

两次二分,第一次取得最小值,第二次往右二分看是否能到更右边 注意超出部分land部分要去掉 #include <cstdio> #include <algorithm> using namespace std; typedef long long ll; struct edge{ int x, y, w, h; }a[10010]; bool cmp(edge A, edge B) { return A.x < B.x; } int n; ll cal(int x) { ll

[hdu5136]Yue Fei&#39;s Battle 2014 亚洲区域赛广州赛区J题(dp)

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 现场赛的时候由于有个地方有点小问题,没有成功AC,导致与金牌失之交臂. 由于今天下午有点事情,无法打重现,所以下午只是花了十分钟做了一道J题,抢了个FB,2333333333 Yue Fei's Battle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others)T

2015北京区域赛 Xiongnu&#39;s Land

Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns against the Xiongnu earned him great acclaim. He was a relative of Emperor Wu because he was the younger half-brother of Empress Wei Zifu (Emperor Wu's wife) and

Heshen&#39;s Account Book HihoCoder - 1871 2018北京区域赛B题(字符串处理)

Heshen was an official of the Qing dynasty. He made a fortune which could be comparable to a whole country's wealth by corruption. So he was known as the most corrupt official in Chinese history. But Emperor Qianlong liked, or even loved him so much

【组队训练】2014鞍山区域赛

三题,排名98,铜尾…… 说实话,这样下去真的很害怕,感觉每次都是铜尾阿= = 等正式比赛时一点失误不就tm又铁了嘛.... 刚开始很多人过I题,zr看了下直接写的.1A 然后部分人过了E,我看了下,水dp,随便敲了下,1A #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105;