2015 영국과 아일랜드 프로그래밍 대회 (UKIEPC 2015)

2015 년 ICPC 영국 그랑프리는, 백 개 팀이 문제가 있었다보다 작, 영국 신생 기업에 ICPC 시간으로 간주 될 수있다.

문제 B 산악 자전거

아이디어는이 분야에서 문제의 표시 후,이 질문은 더 수학 문제처럼 실제로는 질문의 의미를 읽어 보시기 바랍니다. 주어진 N의 경사각은, 컴퓨팅 속도 램프의 끝에 도달

고전 역학의 운동 방정식의 사용

V ^ {2} = V_ {0} ^ {^ {2}} + 2 * g * COS (\ {FRAC \ PI * \ 세타} {180}) * D

그것은 바로 얻을 수 있습니다.

/*
Author Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 1e7+5;

const double pi = 3.1415926;
int a[maxn];

int main()
{
    int n;
    //freopen(".txt","r",stdin);
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    //cout << cos(60.0/180.0*pi) << endl;
    double g,x[5],a[5],v0=0.0,re[5];
    scanf("%d%lf",&n,&g);
    for(int i=0;i<n;i++)    scanf("%lf%lf",&x[i],&a[i]);
    for(int i=n-1;i>=0;i--)
    {
        double dv2 = 2.0 * g * cos(pi*a[i]/180.0) * x[i];
        double v2 = v0 + dv2;
        re[i] = sqrt(v2);
        v0 = v2;
    }
    for(int i=0;i<n;i++)
        printf("%.7lf\n",re[i]);
    return 0;
}

문제 C 대화 로그

아이디어 : 제목 문자열 처리, 단어 수있는 모든 사용자를 기록하기 위해 사용자가 보낸 전에 단어를 보내고, 정렬. 사전에 두 테이블의 구조는, 이름과 단어를 저장하는 의심의 여지가 없다. 모의 채팅 후, 최종 테스트 단어를 분류 한 후, 각 사용자를 통해 전송되는지 여부는 사용자에 의해 전송 된 각각의 워드를 기록, 제어 단어 목록은 역방향 워드 복원 인쇄

/*
Author Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 1e4;

map <string,int> nametable;
map <string,int> wordtable;

string findword[maxn];

int record[maxn][maxn];

typedef struct result
{
    int rk;
    string me;
}Result;

bool cmp(const Result &a, const Result &b)
{
    if(a.rk>b.rk)
        return true;
    else if(a.rk==b.rk&&a.me<b.me)
        return true;
    else
        return false;
}

vector<Result> r;

int main()
{
    int n;
    //freopen("in.txt","r",stdin);
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    scanf("%d\n",&n);
    int namenum = 0;
    int wordnum = 0;
    memset(record, 0, sizeof record);
    r.clear();
    while(n--)
    {
        string s;
        getline(cin,s);
        int len = s.size();
        int pos;
        for(pos=0;pos<len;pos++)
            if(s[pos]==' ')
                break;
        string name = s.substr(0,pos);
        if(nametable.count(name)==0)
            nametable[name] = namenum++;
        pos++;
        for(int i=pos;i<len;i++)
        {
            if(s[i]==' ')
            {
                string word = s.substr(pos,i-pos);
                if(wordtable.count(word)==0)
                {
                    wordtable[word] = wordnum;
                    findword[wordnum++] = word;
                    //cout << word << "##" <<endl;
                }
                record[nametable[name]][wordtable[word]]++;
                pos = i+1;
            }
        }
        string word = s.substr(pos,len-pos);
        if(wordtable.count(word)==0)
        {
            wordtable[word] = wordnum;
            findword[wordnum++] = word;
        }
        record[nametable[name]][wordtable[word]]++;
    }
    for(int i=0;i<wordnum;i++)
    {
        bool ok = true;
        int sum = 0;
        for(int j=0;j<namenum;j++)
        {
            if(record[j][i] > 0)
                sum += record[j][i];
            else
            {
                //cout << findword[i] <<"*"<<endl;
                ok = false;
                break;
            }
        }
        if(ok)
        {
            Result temp;
            temp.rk = sum;
            temp.me = findword[i];
            r.push_back(temp);
        }
    }
    sort(r.begin(),r.end(),cmp);
    int renum = r.size();
    //cout << wordnum << endl;
    //cout << namenum <<endl;
    //cout << renum << endl;
    /*for(map<string,int> :: iterator it = nametable.begin();it!=nametable.end();it++)
        cout << it->first << "&" <<it->second<< endl;
    for(map<string,int> :: iterator it = wordtable.begin();it!=wordtable.end();it++)
        cout << it->first << "&" <<it->second<< endl;
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<7;j++)
            printf("%d ",record[i][j]);
        printf("\n");
    }
    for(int i=0;i<wordnum;i++)
        cout << findword[i] <<"%"<< endl;*/
    if(renum==0)
        cout << "ALL CLEAR\n";
    else
    {
        for(int i=0;i<renum;i++)
            cout << r[i].me << '\n';
    }
    return 0;
}

문제 I Nimionese

생각 :되는 제목 문자열 처리는 물론,이 질문은 큰 시뮬레이션입니다.

문자는 몇 가지 제한으로 두 세트 (세트 경질 및 비 하드 세트)와 변경 비트 열로 분할

단어와 단어 세그먼트의 후속 문자열은 단어의 첫 글자 나머지는 소문자 문자가 필요하다, 대문자 수

다음과 같이 변경 규칙은 다음과 같습니다

하드 편지로 변경 단어의 첫 글자

후속 단어에 대한 어려운 단어의 기간 문자 변화의 첫 글자와 하이픈을 삭제

하드 편지와 같은 단어의 끝, 비 하드의 증가에 상응하는 편지와 편지 H의 톤을 증가하는 경우

사건의 판단에 작은 구덩이 거짓말

/*
Author Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

map <char,char> h;
map <char,char> he;
vector <char> re;
int main()
{
    h['a']='b';
    h['e']='d';
    h['f']='g';
    h['h']='g';
    h['i']='g';
    h['j']='k';
    h['l']='k';
    h['m']='n';
    h['o']='n';
    h['q']='p';
    h['r']='p';
    h['s']='t';
    h['u']='t';
    h['v']='t';
    h['w']='t';
    h['x']='t';
    h['y']='t';
    h['z']='t';
    he['b']='a';
    he['c']='a';
    he['d']='a';
    he['g']='a';
    he['k']='o';
    he['n']='o';
    he['p']='o';
    he['t']='u';
    string s;
    getline(cin,s);
    re.clear();
    //cout << s <<"*" << endl;
    int len = s.size();
    //int pos = 0;
    int p = 1;
    char st;
    for(int now=0;now<len;now++)
    {
        if(s[now] == ' ')
        {
            bool up = false;
            if(s[now-1]>='A'&&s[now-1]<='Z')
            {
                up = true;
                s[now-1] = s[now-1] - 'A' + 'a';
            }
            if(he.count(s[now-1]) > 0)
            {
                re.push_back(he[s[now-1]]);
                re.push_back('h');
                re.push_back(' ');
            }
            else
                re.push_back(' ');
            if(up)
                s[now-1] = s[now-1] - 'a' + 'A';
            p = 1;
        }
        else if(s[now] == '-')
            p=2;
        else if(p == 1)
        {
            //cout << "***" << endl;
            p=0;
            bool up = false;
            //cout << s[now]<<'$'<<endl;
            if(s[now]>='A'&&s[now]<='Z')
            {
                //cout << s[now]<<'$'<<endl;
                up = true;
                s[now] = s[now] - 'A' + 'a';
                //cout << s[now]<<'%'<<endl;
            }
            //cout << "***" << endl;
            if(h.count(s[now])>0)
                s[now] = h[s[now]];
            st = s[now];
            //cout << "***" << endl;
            if(up)
                s[now] = s[now] - 'a' + 'A';
            re.push_back(s[now]);
            //cout << s[now] << "&" << endl;
        }
        else if(p==2)
        {
            if(he.count(s[now])>0)
                s[now] = st;
                //cout << s[now] << "*" <<endl;
                //cout << s[now] << "*" <<endl;
            re.push_back(s[now]);
        }
        else
            re.push_back(s[now]);
    }
    bool up = false;
    if(s[len-1]>='A'&&s[len-1]<='Z')
    {
        up = true;
        s[len-1] = s[len-1] - 'A' + 'a';
    }
    if(he.count(s[len-1]) > 0)
    {
        re.push_back(he[s[len-1]]);
        re.push_back('h');
    }
    if(up)
        s[len-1] = s[len-1] - 'a' + 'A';
    p = 1;
    int num = re.size();
    for(int i=0;i<num-1;i++)
        cout << re[i];
    cout << re[num-1] << '\n';
    return 0;
}

문제 M 마일스톤 카운터

아이디어 :이 제목은 잘 할 수 찾고, 사실, 일치 문제, 여러 다른 위치에 걸쳐 일정한 속도로 타이밍 포인트가, 제목을 읽고, 시간을 기록, 특히 낮은 질문을 통해 질문에지도 한 질문의 의미를 이해하지 않습니다 타이밍의 초기 출발점은,이 일치하는 폭력의 각 시작 지점, 모든 속도는 성공적인 일치와 같은 경우 다음 속도를 계산이다

/*
Author Owen_Q
*/

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int maxn = 1e3+5;
const double eps = 1e-9;

ll t[maxn];
ll x[maxn];

set <ll> re;

bool e(double a,double b)
{
    if(a-b<eps&&b-a<eps)
        return true;
    else
        return false;
}

int main()
{
    int n,m;
    //freopen("in.txt","r",stdin);
    //ios::sync_with_stdio(false);
    //cin.tie(0);
    re.clear();
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)    scanf("%lld",&t[i]);
    for(int i=0;i<n;i++)    scanf("%lld",&x[i]);
    for(int p=0;p<=n-m;p++)
    {
        double v = double(x[p+1]-x[p])/double(t[1]-t[0]);
        //cout << v << "&" << p << endl;
        bool ok = true;
        for(int now=1;now<m-1;now++)
        {
            double vv = double(x[p+1+now]-x[p+now])/double(t[now+1]-t[now]);
            //cout << vv << "&&" <<p + now << endl;
            if(!e(v,vv))
            {
                ok = false;
                break;
            }
        }
        if(ok)
        {
            re.insert(x[p+1]-x[p]);
            //cout << x[p+1]-x[p] << "&&&" << endl;
        }
    }
    set<ll> ::iterator it = re.begin();
    if(re.empty())
        printf("0\n");
    else
    {
        int len = re.size();
        printf("%d\n",len);
        printf("%lld",*(re.begin()));
        it++;
        for(; it != re.end();it++)
            printf(" %lld",(*it));
        printf("\n");
    }
    return 0;
}

 

게시 97 개 원래 기사 · 원 찬양 89 ·은 20000 +를 볼

추천

출처blog.csdn.net/Owen_Q/article/details/102473674