2017 ACM/ICPC Asia Regional Qingdao Online

来源:互联网 发布:矩阵乘法规则 编辑:程序博客网 时间:2024/05/17 23:06

题目链接


01:http://acm.hdu.edu.cn/showproblem.php?pid=6206
02:http://acm.hdu.edu.cn/showproblem.php?pid=6207
03:http://acm.hdu.edu.cn/showproblem.php?pid=6208
04:http://acm.hdu.edu.cn/showproblem.php?pid=6209
05:http://acm.hdu.edu.cn/showproblem.php?pid=6210
06:http://acm.hdu.edu.cn/showproblem.php?pid=6211
07:http://acm.hdu.edu.cn/showproblem.php?pid=6212
08:http://acm.hdu.edu.cn/showproblem.php?pid=6213
09:http://acm.hdu.edu.cn/showproblem.php?pid=6214
10:http://acm.hdu.edu.cn/showproblem.php?pid=6215
11:http://acm.hdu.edu.cn/showproblem.php?pid=6216
 这场比赛交流不想之前那么充足可能是疲劳比赛吧,做出5题后面做10失败很可惜。

一些题解


01 Apple

 这道题就是给定三个点,要你看第四个点是否在三个点组成圆内。
 这道题就是基本求圆的数学题就是卡精度,然后大家纷纷使用java,,,,

import java.io.BufferedInputStream;import java.io.IOException;import java.math.BigDecimal;import java.math.BigInteger;import java.util.Scanner;import java.util.Vector;public class Main{    private static Scanner cin;    public static void main(String[] args) throws IOException    {        cin = new Scanner(new BufferedInputStream(System.in));        int T = cin.nextInt();        for (int cnt = 1; cnt <= T; cnt++)        {            BigDecimal                    two = new BigDecimal("2.0000"),                    x1=cin.nextBigDecimal(), y1=cin.nextBigDecimal(),                    x2=cin.nextBigDecimal(),y2=cin.nextBigDecimal(),                    x3=cin.nextBigDecimal(),y3=cin.nextBigDecimal(),                    x=cin.nextBigDecimal(), y=cin.nextBigDecimal(),x0,y0;            BigDecimal tmp1,tmp2,tmp3;            tmp1 = (x1.multiply(x1).subtract(x2.multiply(x2)).add(y1.multiply(y1)).subtract(y2.multiply(y2))).multiply(y1.subtract(y3));            tmp2 = ((x1.multiply(x1).subtract(x3.multiply(x3)).add(y1.multiply(y1)).subtract(y3.multiply(y3))).multiply(y1.subtract(y2)));            x0 = tmp1.subtract(tmp2);            tmp3 = (y1.subtract(y3)).multiply(x1.subtract(x2)).multiply(two). subtract((y1.subtract(y2)).multiply(x1.subtract(x3)).multiply(two));            x0=x0.divide(tmp3,10, BigDecimal.ROUND_HALF_EVEN);            tmp1 = (x1.multiply(x1).subtract(x2.multiply(x2)).add(y1.multiply(y1)).subtract(y2.multiply(y2))).multiply(x1.subtract(x3));            tmp2 = ((x1.multiply(x1).subtract(x3.multiply(x3)).add(y1.multiply(y1)).subtract(y3.multiply(y3))).multiply(x1.subtract(x2)));            y0 = tmp1.subtract(tmp2);            tmp3 = (y1.subtract(y2)).multiply(x1.subtract(x3)).multiply(two). subtract((y1.subtract(y3)).multiply(x1.subtract(x2)).multiply(two));            y0=y0.divide(tmp3,10, BigDecimal.ROUND_HALF_EVEN);            BigDecimal dis1,dis2;            dis1=(x0.subtract(x1)).multiply(x0.subtract(x1)).add(y0.subtract(y1).multiply(y0.subtract(y1)));            dis2=((x0.subtract(x)).multiply(x0.subtract(x)).add(y0.subtract(y).multiply(y0.subtract(y))));            //System.out.println(dis1);System.out.println(dis2);            if(dis1.compareTo(dis2)<0)                System.out.println("Accepted");            else                System.out.println("Rejected");        }    }}

03 The Dominator of Strings

 这道题的意思就是给你一堆字符串让你求其中是否有一个串使其他所有串都是他的子串。
 那么父串一定是最长的那一个其他所有串都是其子串才有可能,如果一样长就判断相等就行,那么.find()一下就好了。

#include <bits/stdc++.h>using namespace std;string ss[100005];int main(){    int t;    scanf("%d", &t);    while(t--)    {        int n;        scanf("%d", &n);        getchar();        int bj = 1;        int maxx = 0;        string::size_type idx;        for(int i = 1;i <= n;i++)        {            char ls;            ss[i] = "";            while(ls = getchar(), ls != '\n')            {                ss[i] += ls;            }            int len = ss[i].size();            if(len > maxx)            {                bj = i;                maxx = len;            }        }        int flag = 1;        for(int i = 1;i <= n;i++)        {            if(bj == i)                continue;            else if(ss[i].size() == maxx)            {                if(ss[i] != ss[bj])                {                    flag = 0;                    break;                }            }            else if(ss[i].size() < maxx)            {                idx = ss[bj].find(ss[i]);                if(idx == string::npos)                {                    flag = 0;                    break;                }            }        }        if(flag == 0)            printf("No\n");        else            cout<<ss[bj]<<endl;    }    return 0;}

08 Chinese Zodiac

 题目给定两个人的生肖,并且一个人要比另一个人年轻,问他们差几岁,那么直接用map预处理一下各个生肖的岁数,如果男的生肖比女的小直接相减即可,如果一样就差12岁,如果男的比女的大了,说明女的大了一轮,直接12减去生肖差即可。

#include<bits/stdc++.h>using namespace std;const int maxn=1000010;const int inf=0x3f3f3f3f;map<string,int> mp;int main(){    int t;    scanf("%d",&t);    mp["rat"]=1,mp["ox"]=2,mp["tiger"]=3,mp["rabbit"]=4,mp["dragon"]=5,mp["snake"]=6,mp["horse"]=7,mp["sheep"]=8,mp["monkey"]=9,mp["rooster"]=10,mp["dog"]=11,mp["pig"]=12;    while(t--)    {        string a,b;        int x,y;        cin>>a>>b;        x=mp[a],y=mp[b];        int ans=0;        if(x==y) ans=12;        else if(x<y) ans=abs(x-y);        else if(x>y) ans=12-abs(x-y);        printf("%d\n",ans);    }    return 0;}

09 Smallest Minimum Cut

 最小割的最小边模板题。

#include <bits/stdc++.h>using namespace std;typedef long long int LL;const int MAXN = 1010;const int INF = 1<<30;struct Edge{    int to, cap;};int n,m,s,t, np,nc;vector<Edge> edge;vector<int>  G[MAXN];int d[MAXN], cur[MAXN];void init(){        memset(d,0,sizeof(d));        memset(cur,0,sizeof(cur));        memset(G,0,sizeof(G));}void AddEdge(int from, int to, int cap){    edge.push_back((Edge){to, cap});    edge.push_back((Edge){from, 0});    int id = edge.size();    G[from].push_back(id-2);    G[to].push_back(id-1);}bool bfs(){    memset(d, 0, sizeof(d));    queue<int> Q;    Q.push(s);    d[s] = 1;    while(!Q.empty())    {        int x = Q.front(); Q.pop();        if(x == t) return true;        for(int i=0; i<G[x].size(); i++)        {            Edge& e = edge[G[x][i]];            if(!d[e.to] && e.cap>0)            {                d[e.to] = d[x]+1;                Q.push(e.to);            }        }    }    return false;}int dfs(int x, int a){    if(x == t || a == 0) return a;    int flow = 0, f;    for(int& i=cur[x]; i<G[x].size(); i++)    {        Edge& e = edge[G[x][i]];        if(d[x]+1 == d[e.to] && (f=dfs(e.to, min(a, e.cap)))>0)        {            e.cap -= f;            edge[G[x][i]^1].cap += f;            flow += f;            a -= f;            if(a == 0) break;        }    }    return flow;}int Maxflow(){    int flow = 0;    while(bfs())    {        memset(cur, 0, sizeof(cur));        flow += dfs(s, INF);    }    return flow;}int main(){    int qs;    scanf("%d",&qs);    while(qs--)    {        init();        scanf("%d%d",&n,&m);        scanf("%d%d",&s,&t);        int x,y,z;       for(int i=1;i<=m;i++)       {           scanf("%d%d%d",&x,&y,&z);           AddEdge(x,y,z*(m+1)+1);       }       printf("%d\n",Maxflow()%(m+1));    }}

11 A Cubic number and A Cubic Number

 题目是说给定一个素数问它是不是由两个数的三次方的差,那么其实一定是相邻两个的差才会出现素数因为(a + n)^3 - a^3 = 3 * n^2 * a + 3 * a^2 * n + n ^3一定有个因素n而只有n = 1才有可能。
 那知道上面这个公式,再去求就简单了。

#include <bits/stdc++.h>using namespace std;typedef long long LL;map<LL,int>M;int main(){    int t;    scanf("%d", &t);    while(t--)    {        int flag = 0;        LL p;        scanf("%I64d", &p);        LL ans = (p - 1);        if(ans % 3 != 0)            flag = 0;        else        {            ans /= 3;            LL s = sqrt(ans);            if(s *(s + 1) == ans)                flag = 1;        }        if(flag == 1)            printf("YES\n");        else            printf("NO\n");    }    return 0;}

补题


10 Brute Force Sorting

 题目是说,给定一串数字要你每次删去所有递减的子串,问你最后剩下的数字串是什么。
 暴力是直接gg的那么看了网上题解说是要用双向链表扫,每次直接删去节点然后保存删之前的节点。

#include <bits\stdc++.h>using namespace std;const int maxn = 100004;int a[maxn], leff[maxn], rigg[maxn];int que[maxn], top;int main(){    int t;    scanf("%d", &t);    while(t--)    {        memset(a, 0, sizeof(a));        int n;        scanf("%d", &n);        top = 0;        int ans = n;        rigg[0] = 1;        leff[n + 1] = n;        for(int i = 1;i <= n;i++)        {            scanf("%d", &a[i]);            rigg[i] = i + 1;            leff[i] = i - 1;            que[top++] = i;        }        int flag = 1;        while(flag)        {            flag = 0;            int now = 0;            int s = 0;            while(now < top)            {                int i = que[now], ss = 0;                while(rigg[i] <= n)                {                    if(a[i] > a[rigg[i]])ss++, i = rigg[i], flag = 1;                    else                        break;                }                if(ss)ans -= (ss + 1);                if(ss)                {                    rigg[leff[que[now]]] = rigg[i];                    leff[rigg[i]] = leff[que[now]];                    que[s++] = leff[que[now]];                }                while(que[now] <= i&&now < top)now++;            }            top = s;        }        printf("%d\n", ans);        int now = 0;        while(now <= n)        {            if(now != 0)                printf("%d ", a[now]);            now = rigg[now];        }        printf("\n");    }    return 0;}
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玩广东11选5输50万怎么办 玩广东11选5输了十几万怎么办 新办公楼装修好就要搬进去怎么办 oppo手机上的黄页删了怎么办 小米不小心把手机联系人删了怎么办 58同城小区名输不了怎么办 e路发注册直接有积分怎么办 大众速腾的不锈钢圈被碰花了怎么办 公司卡着生育险不给怎么办 济南图书馆借书超过期限了怎么办 淘宝解绑支付宝支付密码不对怎么办 微博支付宝支付密码忘记了怎么办 图虫签约师通过了认证标识怎么办 签证做假工作证明资料被拒怎么办 在广州办个建设厅电工证怎么办 水利考的五大员证到有效期怎么办 额头注射玻尿酸吸收后不平怎么办 施工员证书挂靠拿不回来怎么办 森林公安未转政法编制的人员怎么办 北京的限行新政策外地车怎么办 报考二级建造师工作年限不够怎么办 郑州航院图书馆密码忘了怎么办 无锡妇幼预约挂号过号了怎么办 云南建筑八大员考试没通过怎么办 订车ax7一个月提不到车怎么办 提车时间到了却没车怎么办 一汽大众速腾气囊灯亮该怎么办呢? 幼儿园上课时候电脑上的课件怎么办 黑米紫薯红豆粥不好煮怎么办 母狗生了小狗后不吃东西没奶怎么办 狗给扑倒了主人不想负责怎么办 山东政务网个人中心账号忘了怎么办 网易博客忘记登入名和密码了怎么办 奶水不够怎么办怎样让奶水变多 和初恋分手多年又爱上初恋该怎么办 分手六年的初恋想要和我复合怎么办 不小心把手机里的视频删了怎么办 网签过了中介不配合过户怎么办 房屋被中介恶意网签了怎么办 重介质选矿块矿品位低怎么办 去泰国酒吧选小姐只会说中文怎么办