UESTC 2014 Summer Training #19

A.UVALive 6161

  去迟了,队友已经开始写了,应该是个水题,贴个队友代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
#define INF 1000000000
#define eps 1e-8
#define pii pair<int,int>
#define LL long long int
int n;
char s[1000000];
int main()
{
    //freopen("in2.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    scanf("%d",&n);
    while(n--)
    {
        //memset(s,0,sizeof(s));
        scanf("%s",s);
        int t=strlen(s);
        if(s[t/2]==s[t/2-1])
        {
            cout<<"Do-it"<<endl;
        }
        else
        {
            cout<<"Do-it-Not"<<endl;
        }
    }
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}

B.UVALive 6162

  简单模拟:检查每个记录是否超过2h,记录时间的时候注意是有大部分时间在夜晚则全部记录为夜行时间(分类讨论下)

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

int n, a, b, sunrise, sunset, st, et, cost, nt, s1, s2;

int toMinut(int h, int s)
{
    return h*60+s;
}

int main()
{
#ifdef LOCAL
    freopen("B.in", "r", stdin);
#endif
    while(scanf("%d", &n)) {
        if(n == 0)    break;
        s1 = s2 = 0;
        bool ok = true;
        for(int i = 0; i < n; i++) {
            scanf("%d:%d", &a, &b);
            sunrise = toMinut(a, b);
            scanf("%d:%d", &a, &b);
            sunset = toMinut(a, b);
            scanf("%d:%d", &a, &b);
            st = toMinut(a, b);
            scanf("%d:%d", &a, &b);
            et = toMinut(a, b);
            //finish input
            //check if more than 2 hours
            cost = et - st;
            if(cost > 120)    ok = false;
            //check if drive in night
            if(st < sunrise && et <= sunset) {
                nt = sunrise - st;
                if(nt*2 >= cost)    s2 += cost;
            }
            else if(et > sunset && st >= sunset) {
                nt = et - sunset;
                if(nt*2 >= cost)    s2 += cost;
            }
            else if(st >= sunrise && et <= sunset)
                s2 += cost;
            else if(st <= sunrise && et >= sunset) {
                nt = et-sunset + sunrise- st;
                if(nt*2 >= cost)    s2 += cost;
            }
            else    s1 += cost;
        }
        if(s1+s2 >= 3000 && s2 >= 600 && ok)    printf("PASS\n");
        else    printf("NON\n");
    }
    return 0;
}

C.UVALive 6163

  暴力枚举每一种情况,可以想到一种分类方式:两个数‘运算‘,其结果与第三个数’运算‘,其结果与第四个数‘运算’;(两个数‘运算‘)‘运算’(两个数‘运算‘)   (后者我一开始漏掉了)
  这样的话,枚举每一种排列,枚举上述方式,枚举每一个符号,枚举第一类时,A?B, B?A都要算进去

  第一类用dfs枚举,第二类用三重循环,见代码

  感觉还是比较容易漏情况的...

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
#define INF 1000000000
#define eps 1e-8
#define pii pair<int,int>
#define LL long long int
int n,a[4];
char s[4]={‘+‘,‘-‘,‘*‘,‘/‘};
char in[4];
bool ok;
bool deal();
void dfs();
int main()
{
    //freopen("out.txt","w",stdout);
    while(scanf("%d",&n)==1&&n)
    {
        bool ans=true;
        for(int i=1;i<=n;i++)
        {
            scanf("%s",in);
            if(ans==false)
                continue;
            a[0]=in[0]-‘0‘;
            a[1]=in[1]-‘0‘;
            a[2]=in[2]-‘0‘;
            a[3]=in[3]-‘0‘;
            if(deal()==false)//这四个数弄不出10
            {
                ans=false;
            }
        }
        if(ans==true)
            printf("TRUE\n");
        else
            printf("BUSTED\n");
    }
    //fclose(stdin);
    //fclose(stdout);
    return 0;
}
void dfs(int x, int ans)
{
//    cout << x << " " << ans << endl;
    if(x == 4 && ans == 10) {
        ok = true;
        return;
    }
    if(ok || x >= 4)  return;
    int c = ans, d = a[x];
    dfs(x+1, c+d);
    dfs(x+1, c-d);
    dfs(x+1, d-c);
    dfs(x+1, c*d);
    if(d != 0)
        dfs(x+1, c/d);
    if(c != 0)
    dfs(x+1, d/c);
}
int calc(int x, int y, int t)
{
    switch(t) {
        case 0: return x+y;
        case 1: return x-y;
        case 2: return x*y;
        case 3: return x/y;
        default:    return -1;
    }
}
bool deal()//看目前的四个数能不能弄出10
{
    ok = false;
sort(a, a+4);
    do
    {
        dfs(1, a[0]);
        for(int i = 0; i < 4; i++) {
            if(a[1] == 0 && i == 3) continue;
            int x = calc(a[0], a[1], i);
            for(int j = 0; j < 4; j++) {
                if(a[3] == 0 && j == 3) continue;
                int y = calc(a[2], a[3], j);
                for(int k = 0; k < 4; k++) {
                    if(y == 0 && k == 3)    continue;
                    if(calc(x, y, k) == 10) {
                        ok = true;
                        break;
                    }
                }
            }
        }
        if(ok)  return true;
    }while(next_permutation(a,a+4));
    return false;
}

I.UVALive 6169

  贪心做法 从前往后贪就行了(我一开始以为从后往前,这种方式不好处理(队友代码不贴了...)

J.UVALive 6170

  扩展欧几里德  题意就是求ax+by=c  其中x+y最小

  注意到题中条件a < b < c -> b > 0 && x+y最小等价于x最小(正整数)(x+y = x+(c-ax)/b a/b<1 x变大,x+y变大)

  后面就是很经典的问题...求x的最小整数解,但是会超long long...

  解决办法1:  高精度

  解决办法2:  仔细读题,a, b不超过32位,

求x最小整数解时

         t = b/gcd(a,b);

         xm = ((x*d/gcd(a,b))%t + t) % t

t不会超过32位int,x*d可能会超long long,那么写成 ( x%t * d/gcd(a,b)%t )%t 便解决了(能挖到这个信息的也是吊啊)

  出前两题的速度其实还行,队友卡I题其实很久...(很想让他交给我写呀呀!

  C题由于对next_permutation理解不深,卡了(next_permutation 数组需要从小到大排列 大致理解原理就明白了)

  J题卡精度了,没有估计数据范围也是傻

                        

UESTC 2014 Summer Training #19,布布扣,bubuko.com

时间: 2024-09-30 18:16:57

UESTC 2014 Summer Training #19的相关文章

UESTC 2014 Summer Training #3 Div.2

(更新中) A:ZOJ 3611 BFS+状态压缩 [题意]:给定一张n*m的图,图上每个点有如下情况:L,R,D,U:代表在该点上只能往它已经给定的方向前进.#,W:不能走到该点.$:走到该点,可以花两分钟得到一分值,然后可以从该点向任意方向走.0:走到该点后可以向任意方向走.然后给你起点和终点坐标,问是否能从起点走到终点,如果能,求出可获得的最大分值以及与之对应达到该最大分值所需的的最小时间花 费.(其中起点和终点坐标可以相同)[知识点]:BFS+状态压缩[题解]:我觉得超级棒的题!真心感觉

UESTC 2014 Summer Training #16 Div.2

虽然被刷了还是要继续战斗下去嗯...就是基础不好,难度相对较大 A.SPOJ AMR10A 点是顺时针给出的,可以在图上画画(脑补也行),连线x-a,x-b(x为选定的一个点,比如第一个点),就把所求面积分成了四部分,a-b左边部分是较容易求出来的, 三角形面积是直接可求,另外两个多边形面积是可以预处理出来的(多个三角形面积和) 反正我是沒想出來...看題解也理解半天,多邊形面積转化为三角形面积和 嗯嗯 #include <iostream> #include <cstdio> #

UESTC 2014 Summer Training #7 Div.2

DAY7一开始状态还行,最高纪录rank7,然后没力气了,一直跌到rank24,问题还是很多呐.昨天总结的问题依然很大. Problem A UVA 12377 就一开始还是慌了,没审清楚题意就去WA了一发. 大意是给你一个数字表示的字符串,最高20位,第一表示有N个质数,后面是其幂的非降序排列,所求能表示的数个数. 简单的排列组合题,不过需要处理出2~END的不同划分,并且满足非降序,用dfs处理即可. 具体就是dfs过程中记录下每一个数字出现的次数,因为相同的次数是不计顺序的,需要在统计时除

UESTC 2014 Summer Training #5 Div.2

持续更新中 B:URAL 1874 三分搜索 [题意]: 给出两条边a,b以及一个墙角,求由这两条边和墙角所构成的四边形的最大面积.[知识点]: 三分搜索[题解]: 将四边形分为两个三角形,其中一个由a,b,以及第三条同时作为墙角斜边的边c,另一个三角形即为墙角与边c构成 则墙角所在的三角形的最大面积为c*c/4,abc变所在的三角形的面积可用海伦公式求出,然后主要是用三分来求这个c,得到c后就可以得到最佳答案了. 还有一种现成的结论...[代码1]: 1 #include <map> 2 #

UESTC 2014 Summer Training #18 Div.2

A.UVALive 6661 题意从1~N中选k个数,和为s的方案数 第一眼搜索,估计错状态量,又去yydp...浪费大量时间 数据很小的,状态数都不会超过2^N...直接dfs就过了 //state二进制表示选取的数 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; const int maxn = 200; in

UESTC 2014 Summer Training #6 Div.2

又是只过两水题,不过状态有些回升,也是差点一血. Problem A SPOJ AMR11A 显然的dp?就一抖就想到尝试从(R,C)推到(1,1),正着推的话,只能检查某一种解可不可行(就有人想出了二分+DP的神奇方法..刚卡过..不过上界是把所有龙加起来..不闲麻烦的话..可以按照贪心的方法先跑一个上界,就每一步选当前最优) 倒着推,龙的话,就加上,药水的话,减去?不够,和1取最大值:某一个点的f[i][j]就是两种策略取最小值: f[i][j] = min{ max(1, f[i+1][j

UESTC 2014 Summer Training #10 Div.2

B.Race to 1 UVA 11762 第一次接触概率dp,完全没想到是dp...没想到能递推出来0 0 首先需要知道 总的期望=每件事的期望×每件事发生的概率 然后可以根据这个来写递推公式,也是dp? 假设不小于x的质数有m个,x的质因子有n个(种 更确切),那么在求X的期望时,可以考虑由他能转移过去的状态转移,X,X/pi p是x的质因子 所以不难得出E(x) = 1+(m-n)/mE(X)+1/msigmaE(X/pi) 注意会加1,因为X转移到后面的情况,就多了一步 //Update

UESTC 2014 Summer Training #11 Div.2

E - Prototype ZOJ 3235 把(d2,0)代入第二个方程可以得到一个方程:经过(d2,0)的抛物线的起点的方程 再把它和第一个方程联立,就能解出两条抛物线的交点,再验算:是否在0~d2范围内,是否在x=d1时会撞到building2 注意可能不需要滑行就能到达(d2,0),先特殊处理这种情况 一开始傻逼理解错题意,后来一直修改又去考虑了不会出现的情况,例如A=0,delta<0,最后才发现了我忘记打sqrt了!!! 这场比赛题略难...就不会做 当时还是比较慌,很怕过不了题,加

2014 Super Training #3 H Tmutarakan Exams --容斥原理

原题: URAL 1091  http://acm.timus.ru/problem.aspx?space=1&num=1091 题意:要求找出K个不同的数字使他们有一个大于1的公约数,且所有的数字都不能大于一个指定的数字S. 解法:可以考虑每个S内的素数,此素数和它的所有倍数构成一个集合,则可以在这些集合中任意去k个元素,C(n,k)即为这种情况下的方法种数,比如K = 3,S = 10, 则可以形成3个集合: {2,4,6,8,10} , {3,6,9}, {5,10} ,第一个集合C(5,