Codeforces Round \ # 274 (Div. 2) 문제 풀이 보고서

제목 주소:http://codeforces.com/contest/479
이번 에는 스스로 네 문제 밖 에 풀 수 없다.
A 문제: 표현 식
물 문제.
여섯 가지 상황 을 매 거 하여 최대 치 를 구하 면 된다.
코드 는 다음 과 같 습 니 다:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
int main()
{
    LL a, b, c, d[10];
    while(scanf("%I64d%I64d%I64d",&a,&b,&c)!=EOF)
    {
        d[0]=a*b*c;
        d[1]=(a+b)*c;
        d[2]=a+b+c;
        d[3]=a*(b+c);
        d[4]=a+b*c;
        d[5]=a*b+c;
        sort(d,d+6);
        printf("%I64d
",d[5]); } return 0; }

B 문제:
Towers
물 문제.
매번 가장 많은 것 을 가장 적은 것 으로 꺼 내 서 가장 큰 것 과 가장 적은 것 의 차이 가 1 보다 작 거나 같 을 때 까지 준다.
코드 는 다음 과 같 습 니 다:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
struct node
{
    int x, num;
}fei[1000];
int cmp(node x, node y)
{
    return x.x<y.x;
}
int a[2000], b[2000];
int main()
{
    int n, m, i, j, cnt, ans;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d",&fei[i].x);
            fei[i].num=i;
        }
        cnt=0;
        while(m--)
        {
            sort(fei,fei+n,cmp);
            if(fei[n-1].x-fei[0].x<=1) break;
            a[cnt]=fei[n-1].num;
            b[cnt++]=fei[0].num;
            fei[n-1].x--;
            fei[0].x++;
        }
        sort(fei,fei+n,cmp);
        printf("%d %d
",fei[n-1].x-fei[0].x, cnt); for(i=0;i<cnt;i++) { printf("%d %d
",a[i]+1,b[i]+1); } } return 0; }

C 문제:
Exams
아니면 물?작은 욕심
작은 욕심.먼저 표 시 된 날짜 에 따라 순 서 를 정 한 다음 에 한 번 훑 어보 면 되 고 작은 것 으로 작은 것 을 우선 고려 할 수 있다.
코드 는 다음 과 같 습 니 다:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
struct node
{
    int x, y;
}fei[6000];
int cmp(node x, node y)
{
    if(x.x==y.x)
        return x.y<y.y;
    return x.x<y.x;
}
int main()
{
    int n, i, j, ans, k, x1, x2;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&fei[i].x,&fei[i].y);
        }
        sort(fei,fei+n,cmp);
        k=1;
        for(i=0;i<n;i++)
        {
            if(fei[i].y>=k)
            {
                k=fei[i].y;
            }
            else
            {
                k=fei[i].x;
            }
        }
        printf("%d
",k); } return 0; }

D 문제:
아니면 물...이분
각각 4 가지 상황 을 고려 하여 x, y, x + y, y - x.그리고 2 점 으로 차 이 를 찾 아 이 네 개의 숫자 를 만 들 었 다.
코드 는 다음 과 같 습 니 다:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>

using namespace std;
#define LL __int64
int a[110000];
int bin_search(int x, int y, int high)
{
    int low=0, mid;
    while(low<=high)
    {
        mid=low+high>>1;
        if(y-a[mid]==x) return 1;
        else if(y-a[mid]>x) low=mid+1;
        else high=mid-1;
    }
    return 0;
}
int main()
{
    int n, l, x, y, i, j, k, flag1, flag2;
    while(scanf("%d%d%d%d",&n,&l,&x,&y)!=EOF)
    {
        flag1=flag2=0;
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
            if(a[i]==x)
                flag1=1;
            if(a[i]==y)
                flag2=1;
        }
        if(flag1&&flag2)
        {
            printf("0
"); } else { flag1=flag2=0; for(i=1;i<n;i++) { if(bin_search(x,a[i],i-1)) { flag1=1; break; } } for(i=1;i<n;i++) { if(bin_search(y,a[i],i-1)) { flag2=1; } } if(flag1&&flag2) { printf("0
"); } else if(flag1) printf("1
%d
",y); else if(flag2) printf("1
%d
",x); else { int flag=0; for(i=1;i<n;i++) { if(bin_search(y+x,a[i],i-1)) { flag=1; break; } } if(flag) { printf("1
%d
",a[i]-x); } else { flag=0; for(i=1;i<n;i++) { if(bin_search(y-x,a[i],i-1)&&(a[i]-y>=0||a[i]+x<=l)) { flag=1; break; } } if(flag&&a[i]-y>=0) { printf("1
%d
",a[i]-y); } else if(flag&&a[i]+x<=l) { printf("1
%d
",a[i]+x); } else { printf("2
%d %d
",x,y); } } } } } return 0; }

좋은 웹페이지 즐겨찾기