OUC_Summer Training_ DIV2_#7 718

是18号做的题啦,现在才把报告补上是以前不重视报告的原因吧,不过现在真的很喜欢写报告,也希望能写一些有意义的东西出来。
A - Dragons
Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

Description

Kirito is stuck on a level of the MMORPG he is playing now. To move on in the game, he's got to defeat all n dragons that live on this level. Kirito and the dragons have strength, which is represented by an integer. In the duel between two opponents the duel's outcome is determined by their strength. Initially, Kirito's strength equals s.

If Kirito starts duelling with the i-th (1 ≤ i ≤ n) dragon and Kirito's strength is not greater than the dragon's strength xi, then Kirito loses the duel and dies. But if Kirito's strength is greater than the dragon's strength, then he defeats the dragon and gets a bonus strength increase by yi.

Kirito can fight the dragons in any order. Determine whether he can move on to the next level of the game, that is, defeat all dragons without a single loss.

Input

The first line contains two space-separated integers s and n (1 ≤ s ≤ 1041 ≤ n ≤ 103). Then n lines follow: the i-th line contains space-separated integers xi and yi (1 ≤ xi ≤ 1040 ≤ yi ≤ 104) — the i-th dragon's strength and the bonus for defeating it.

Output

On a single line print "YES" (without the quotes), if Kirito can move on to the next level and print "NO" (without the quotes), if he can't.

Sample Input

Input
2 2
1 99
100 0
Output
YES
Input
10 1
100 100
Output
NO

Hint

In the first sample Kirito's strength initially equals 2. As the first dragon's strength is less than 2, Kirito can fight it and defeat it. After that he gets the bonus and his strength increases to 2 + 99 = 101. Now he can defeat the second dragon and move on to the next level.

In the second sample Kirito's strength is too small to defeat the only dragon and win.

奥特曼要来打小怪兽啦~不过他需要把所有的小怪兽都打败才能通关。每个恐龙的属性有恐龙自己的能量,和打败恐龙后奥特曼能获得的能量,能通关就输出YES,否则输出NO。在这里奥特曼能获得的能量都是正的,所以这个题就简单啦,打败比自己能量少的的恐龙后获得能量再去打败其他恐龙。这题唯独值得收获的是sort函数的新用法用在结构体中超级爽啊!先把代码贴上紧接着再总结一下sort函数。

#include<iostream>
#include<algorithm>
using namespace std;

struct D
{
    int x;
    int y;
};
bool cmp (D a,D b)
{
    return a.x < b.x;
}
int main()
{
    int s,n,i = 0,j = 0,k,e,f;
    struct D a[1000],b[1000];
    cin >> s>> n;
    while(n--)
    {
        cin >> e>> f;
        if(e < s)
        {
            a[i].x = e;
            a[i].y = f;
            i++;
        }
        if(e >= s)
        {
            b[j].x = e;
            b[j].y = f;
            j++;
        }
    }
    sort(b,b+j,cmp);
    for(k = 0;k < i;k++)
        s += a[k].y;
    for(k = 0;k < j;k++)
    {
        if(s > b[k].x)
            s += b[k].y;
        else
            break;
    }
    if(k == j)cout <<"YES"<<endl;
    else cout<< "NO"<<endl;
    return 0;
}
View Code

上面是我的代码不过大神的代码中cmp函数比我想的周全,先贴上来。

bool cmp(data a,data b)
{
    if (a.x < b.x)
        return true;
    if (a.x == b.x && a.y > b.y)
        return true;
    return false;
}

sort函数在做题的时候经常能够用上,也很方便有用。sort函数共有3个参数,起始位置,终止位置,比较函数。起始和结束的区间是左闭右开的(这个我还真是今天才注意到)。比较函数是bool型的。字符串也能作为参数。默认的排序是升序的。下面给出几个个cmp函数以供参考。

bool cmp(int a,int b)
{
    return a  > b;     //如果a > b 就返回true 这样就是按照降序排列
}
bool cmp(node x, node y)     //参数类型为结构体
{
    if(x.a != y.a) return x.a < y.a;     //先按a的升序排;
    if(x.b != y.b) return x.b > y.b;    //如果a相等,就再按照b的降序排列
    if(x.c != y.c) return x.c > y.c;    //如果b也相等,就按照c的降序排列
}

B - T-primes
Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

Description

We know that prime numbers are positive integers that have exactly two distinct positive divisors. Similarly, we'll call a positive integertТ-prime, if t has exactly three distinct positive divisors.

You are given an array of n positive integers. For each of them determine whether it is Т-prime or not.

Input

The first line contains a single positive integer, n (1 ≤ n ≤ 105), showing how many numbers are in the array. The next line contains nspace-separated integers xi (1 ≤ xi ≤ 1012).

Please, do not use the %lld specifier to read or write 64-bit integers in С++. It is advised to use the cincout streams or the %I64dspecifier.

Output

Print n lines: the i-th line should contain "YES" (without the quotes), if number xi is Т-prime, and "NO" (without the quotes), if it isn't.

Sample Input

Input
3
4 5 6
Output
YES
NO
NO

输入一个数,检验他是不是因子有且只有3个(包括1和他本身)。想法是:检验这个数能否开根号(不能被开根号的话一定不符合要求)且开根号得到的数必须是素数。(注意判断素数的循环,容易超时)

#include<stdio.h>
#include<math.h>
int main()
{
    __int64 s,m;
    int prime(__int64 x);
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%I64d",&s);
        if(s==1)
        {
            printf("NO
");
            continue;
        }
        m=sqrt(s);
        if((m*m)!=s)
        {
            printf("NO
");
            continue;
        }
        else
        {
            if(prime(m) == 1)
            {
                printf("YES
");
            }
            else
            {
                printf("NO
");
            }
        }
    }
    return 0;
}
int prime(__int64 x)
{
    int i;
    for(i=2;i<=sqrt(x);i++)
    {
        if(x%i==0)
            return 0;
    }
    return 1;
}
View Code
原文地址:https://www.cnblogs.com/lwy-kitty/p/3207365.html