2014 ACM 上海现场赛B,I,J && UVALive7146 7147 7139

2014最难赛区



7146 贪心这道题是考验STL的.

我们按照一个顺序排序(我方攻击力升序,敌方防御力升序),

此时因为要全部歼灭,优先考虑如何干掉敌方防御力最高的,此时将所有攻击力比它高的我方都放入multiset中维护,然后选择一个”最合适”的匹配(如果有我方防御力大于此时敌方攻击力的元素就使用,若没有就牺牲.首要任务是全部歼灭,此时能够消灭这个敌方的人都已经在multiset中了,若能够不牺牲却让其牺牲是不必要的,因为后面的元素已经保证能够歼灭后面的敌方)

#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 1100000
using namespace std;
struct P{
    int d,a;
    bool operator <(const P &x) const{
        return a>x.a;
    }
}A[maxn],B[maxn];

int main(){
    int T,cas=1;
    scanf("%d",&T);
    while(T--){
        int N,M;
        scanf("%d",&N);
        scanf("%d",&M);
        for(int i = 1;i<=N;i++)
            scanf("%d%d",&A[i].a,&A[i].d);
        for(int i = 1;i<=M;i++)
            scanf("%d%d",&B[i].d,&B[i].a);
        sort(A+1,A+N+1);
        sort(B+1,B+M+1);
        int ans = N;
        multiset<int> st;
        for(int i = 1,p=1;i<=M;i++){
            while(p<=N && B[i].a<=A[p].a)
                st.insert(A[p++].d);
//            for(auto ii=st.begin();ii!=st.end();ii++)
//                printf("%d ",*ii);
            if(st.empty()) {ans=-1;break;}
            auto it = st.upper_bound(B[i].d);
            if(it==st.end()){
                st.erase(st.begin());
                ans--;
            }
            else st.erase(it);
        }
        printf("Case #%d: %d\n",cas++,ans);
    }

    return 0;
}

/**
10

3 2
10 10
11 11
20 20
10 10
20 20

3 2

40 40
12 8
30 10
10 10
20 20

2 2
10 10
20 20
10 5
20 5

3 2
5 7
7 3
1 2
4 4
2 2
2 1
3 4
1 10
5 6

2 2
12 8
30 10
10 10
20 20

**/

7147

PS:我不会证明这个贪心,因为还要考虑另一堆在XX情况反而会大于这堆呢

仍旧贪心.题目意思是有N个人,按比赛分数高低选取M个.选不上的最大分数和选上的最小分数.



if( A < C) swap(A,C);选不上,此时将人分为两堆.M+1,N-M-1, 要让M+1分数尽量多

则 ans1 += (M+1)*max(A,B);

接下来对于M+1内部来说,要尽量平均,两种情况都是平局,或一胜一负对半. ans1 += M/2 *max(A+C,B+B);

如果M是奇数,那么不会对半,定有一个为多输一局或仍是平局

if(M&1) ans1 += max(C,B);

同理可知选上的最小分数就是分为M-1,N-M+1 两堆,

ans2 += min(C,B)*(M-1)

接下来对于N-M+1内部来说,尽量平均,则

ans2 += (N-M)/2 *min(A+C,B+B);

如果N-M是奇数,那么不会对半,定有一个为多输一局或仍是平局

if( N-M &1) ans2 += min(A,B);

#include<set>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 1100000
using namespace std;

int main(){
    int T,N,M,A,B,C;
    int cas = 1;
    for(scanf("%d",&T);T;T--) {
        scanf("%d%d",&N,&M);
        scanf("%d%d%d",&A,&B,&C);
        if(A<C) swap(A,C);
        long long ans1=0,ans2=0;
        ans1 += (N-M-1) * max(A,B);
        ans1 += M/2 * max(A+C,B+B);
        if(M & 1)
            ans1 += max(C,B);
        ans2 += (M-1) * min(B,C);
        ans2 += (N-M)/2 * min(A+C,B+B);
        if(N - M & 1)
            ans2 += min(A,B);
        printf("Case #%d: %lld %lld\n",cas++,ans1,ans2);

    }
    return 0;
}

7139

这个题就是模拟题,但是性质很深.

观察可得到一个结论:对于一个方格中的人来说,如果要有一个完整的时针旋转,则必然是一边走下去,一边走上去,且”包含”所以不用考虑R,L.

若车在人的正左方下降了X次,上升了Y次,那么那个人的旋转圈数便是abs(X-Y)。

然后暴力模拟车的移动:

在车向下移动的时候,我们就要给车影响右方的一个矩阵加上1。

在车向上移动的时候,我们就要给车影响右方的一个矩阵减去1。

这里用Vector进行建图,因为只给了NXM的范围…

#include<set>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 1100
using namespace std;
char *str = "UDLR";
int fx[4][2] = {-1,0,  1,0,  0,-1,  0,1};
vector<vector<int> > C;
void add(int r1,int r2,int c,int val){
    C[r1][c] += val;
    C[r2][c] -= val;
}
int main(){
    int T;
    int cas = 1;
    for(scanf("%d",&T);T;T--) {
        int N,M,K;
        scanf("%d%d%d",&N,&M,&K);
        C = vector<vector<int> >(N+2,vector<int>(M+2,0));
        int r=1,c=1;
        for(int i = 0;i<K;i++){
            char op;
            int step;
            scanf(" %c%d",&op,&step);
            if(op==‘U‘) add(r-step,r,c,-1);
            if(op==‘D‘) add(r,r+step,c,1);
            int f = strchr(str,op)-str;
            r += step*fx[f][0];
            c += step*fx[f][1];
        }
        long long ans = 0;
        for(int i = 1;i<=N;i++)
        for(int j = 1;j<=M;j++){
            C[i][j] = C[i][j] + C[i-1][j] + C[i][j-1] -C[i-1][j-1];
            ans += C[i][j] * C[i][j];
        }
        printf("Case #%d: %lld\n",cas++,ans);
    }
    return 0;
}
时间: 2024-08-01 01:36:16

2014 ACM 上海现场赛B,I,J && UVALive7146 7147 7139的相关文章

2014 acm鞍山现场赛总结

好像大家都习惯打完比赛写总结,我也来水一发好了.. 记一下流水账,那么多第一次献给了acm,不记一下就白去那么远的地方了.. 首先比赛前网上买了机票跟火车票了.比赛前一天早上6点钟起来收拾东西6点半坐地铁去机场.第一次来机场,太高大上啦,感觉就像大乡里入城差不多,这里的随便一个做前台的英语都完虐我几十条街,领了个机票傻乎乎的过了安检去了机票口,提前来了半个钟,逛了下机场的商店,尼玛全都没写价格,一看就知道各种贵,只好路上拍拍灰机场,吃了点垃圾食品就上机了,上机五分钟前发现还有个候机宝的东西,尼玛

2014 acm亚洲区域赛(北京)总结

2014 acm/icpc 亚洲区域赛北京站    第一次到外面去比赛,周五下午做高铁到北京,报到注册后就去找在北京的同学玩了.    周六,上午,随便拉了个cf,我们随便看了下,没有写代码.下午的开幕式就那样,几个领导讲几句话,之后的热身赛,A题是数试题集出现多少次ACM,我们理解为在这题出现了多少次?第一次交了个17,wa掉了,交了个19,又wa了,后来好像又交了个13,都wa掉了,想哭了%>_<%,后面的D题更逗,给一段代码,判断是wa还是TLE,只有一个测试文件,并且样例数<=3

ACM/ICPC2015上海现场赛B题题解

给你一棵完全二叉树,初始能量为0,根节点编号为1(也就是说最左边那条路上节点的编号分别是2^0,2^1,2^2…2^(h-1)).从根节点开始往下走k-1步,走到每个节点选择加上或减去这个节点的编号,问走完这k个节点时能量恰好为n的方案.Special Judge. 在队友的提醒下(TAT我真是讨厌鹰语)看明白了数据范围,很明显是一个考二进制性质的题.于是一上手我先把样例改成了走最左路线的情况.样例出的蛮良心,一个奇数一个偶数,刚好对应两条路线:一直走左儿子或者走k-2个左儿子最后一个走右儿子.

HDU 5128 The E-pang Palace(2014广州赛区现场赛B题 计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5128 解题报告:在一个平面上给出n个点的坐标,用这n个点作为矩形的四个顶点,作两个矩形,要求两个矩形不能相交,也不能有边和点相交,然后两个矩形的面积之和要最大,求最大的面积之和是多少?如果不存在输出imp 因为n <=30,所以可以先把所有的矩形枚举出来,然后再暴力判断两两矩形组合,首先要满足位置关系,然后取面积和最大就是了.要注意的地方就是要小心一个大矩形包含一个小矩形的情况,在这种情况下,是满足

hdu 5078 Osu! (2014 acm 亚洲区域赛鞍山 I)

题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5078 Osu! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 180    Accepted Submission(s): 114 Special Judge Problem Description Osu! is a very p

HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽值就是socre[a1][a2] + socre[a2][a3] + ..... socre[an-1][an],但是这个序列里面并不是所有的数都是确定的,输入包含一些大于0的数和一些-1,-1表示这个数可以任意,但是要在m的范围内,给出socre[i][j],求这个序列最大的美丽值. 一个二维dp

HDU5572 2015上海现场赛A题1001

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<queue> 5 #include<map> 6 #include<set> 7 #include<cmath> 8 using namespace std; 9 typedef long long LL; 10 const double eps = 1e-8; 11 int sgn

2013 年 acm 长春现场赛

A - Hard Code Hdu 4813 题目大意:给你一坨字符串,让你输出其栅栏密码的解码形式 思路:水题模拟 1 #include<iostream> 2 #include<cstdio> 3 #include <math.h> 4 #include<algorithm> 5 #include<string.h> 6 #include<queue> 7 #define MOD 1000003 8 #define maxn 20

HDU 5120 Intersection(2014北京赛区现场赛I题 计算几何)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5120 解题报告:给你两个完全相同的圆环,要你求这两个圆环相交的部分面积是多少? 题意看了好久没懂.圆环由一个大圆里面套一个小圆,中间部分就是圆环,两圆环相交面积 = 大圆相交的面积 - 2*大圆与小圆相交的面积 + 小圆与小圆相交的面积. 也就是说,这题就可以化为求两个圆的相交的面积了.可以利用两个圆的方程,求出圆的交点所在的直线,然后求出圆心到这条直线的距离,就可以求出两个圆对应的扇形的圆心角是多