第十五届北京师范大学程序设计竞赛决赛(网络同步赛)

E. Euclidean Geometry
Time Limit: 1000msMemory Limit: 262144KB 64-bit integer IO format: %lld Java class name: Main
Special Judge
Submit Status PID: 52505
在某节无聊的课上,SK同学随意画了一个三角形然后用尺子量了一下,发现三边长分别为a,b,c,然后SK同学拿起圆规分别以三个顶点为圆心画了三个圆,为了使图形看上去更美观,这三个圆两两不相交也互不包含,这里认为圆的半径可以是0(称之为“点圆”),现在SK同学想知道怎么画圆才能使三个圆的面积之和最大。
这里写图片描述

Input
第一行是一个正整数T(leq 100),表示测试数据的组数,

每组测试数据只有一行,包含三个不超过100的正整数a,b,c,表示三条边的长度,保证这三条边能构成一个三角形。

Output
对于每组测试数据,输出三个圆的面积之和的最大值,要求相对误差不超过10^{-6},

也就是说,令输出结果为a,标准答案为b,若满足frac{ left | a-b ight | }{max(1,b)} leq 10^{-6},则输出结果会被认为是正确答案。
Sample Input
2
1 1 1
3 6 5
Sample Output
3.141592653590
81.681408993335
Hint
pi=acos(-1.0)=3.141592653589793238462643383…

官方题解:设三个园的半径为x,y,z,那么要满足六个不等式x>=0,y>=0,z>=0,x+y<=a,y+z<=b,z+x<=c,可行解对应空间中的一个凸区域,使得x^2+y^2+z^2(就是(0,0,0)到(x,y,z)的欧式距离的平方)最大的点一定在定点上,不妨设a<=b<=c,讨论出所有可能的情况求个最大值即可,实际上ans=pai(b^2+(c-b)^2),所以只要讨论中包含了这种情况都能通过的。
我的理解:圆越多,面积越小,又不能包含所以

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define pi acos(-1.0)
int p[3];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a,b,c;
        scanf("%d%d%d",&p[0],&p[1],&p[2]);
        sort(p,p+3);
        a=p[0],b=p[1],c=p[2];
//        double x=(a+b)*1.0/3.0;
//        double y=(a+b-c)*1.0/2.0;
//        double z=b;
//        if(x>)
            double s=pi*((b*b)+(c-b)*(c-b));
            printf("%.12lf
",s);

    }
    return 0;
}

K. Keep In Line
Time Limit: 2000msMemory Limit: 262144KB 64-bit integer IO format: %lld Java class name: Main
Submit Status
又到饭点了,SK同学靠着惯性走到了食堂,但长长的队伍顿时让他失去了食欲。突然,他注意到某个窗口前的队伍里明显存在插队的现象,于是他默默记录下了同学们进队和出队的变化。

对于进队,SK同学只知道队伍里多了一个人,并不知道新来的人是老老实实站到了队尾还是插到了队伍里的某个位置;对于出队,SK同学能确定是队伍里站在最前面的人出队了。

初始时队伍为空,给出n条队伍进出的信息,保证已经出队的同学不会再入队,并且最终队伍也为空,现在SK同学想知道有多少不插队的好同学。

Input
第一行是一个正整数T(leq 5),表示测试数据的组数,

对于每组测试数据,

第一行是一个整数n(1leq n leq 100000),表示这个队伍进出的信息数,

接下来n行,每行是两个字符串Opt Name,其中Opt为”in”代表进队,”out”代表出队,Name为进队或出队的人的名字,

所有信息按照时间顺序给出,名字由英文字母和阿拉伯数字组成,长度不超过10,保证每个人的名字各不相同。

Output
对于每组测试数据,输出一行,包含一个整数,表示不插队的人数。

Sample Input
1
6
in quailty
in hwq1352249
out hwq1352249
in zhuaiballl
out quailty
out zhuaiballl
Sample Output
2

思想:开一个队列,一个map数组,
队列用来存排队的人的顺序,map用来记录
比如

首先进去两个
quailty(0)  hwq1352249(0)
然后out  hwq1352249,无法出来,标记为一
quailty(0)  hwq1352249(1)  zhuaiballl(0)
然后quailty出队,等于1的也出队
然后zhuaiballl出队,就ok了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#include<iostream>
#include<map>
using namespace std;
map<string,int>q;
queue<string>qq;
int main()
{
    int t,n;
    scanf("%d",&t);
    while(t--)
    {
        q.clear();
        while(!qq.empty())
            qq.pop();
        scanf("%d",&n);
        int in=0;
        int xian=0;
        int sum=0;
        for(int i=0; i<n; i++)
        {
            string x,y;
            cin>>x>>y;
            if(x=="in")
            {
                qq.push(y);
                q[y]=1;
            }
            else
            {
                while(q[qq.front()]==0&&!qq.empty())
                    qq.pop();
                if(qq.front()==y)
                {
                    sum++;
                    q[y]=0;
                    qq.pop();
                }
                else
                    q[y]=0;
            }
        }
        printf("%d
",sum);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zxy160/p/7215116.html