A.Fancy Fence

题意:判断一个角是不是正多边形的内角。
分析:如果 60<=d<180 &&  360%(180-n)==0 就是符合的内角。
View Code
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
    int t;
    int n;
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&n);
        if (n<180 && n>=60 && 360%(180-n)==0)
            printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

B.Multithreading

题意:模拟题。n个线程,知道了每个线程现在的位置,问那些线程里面一定有新的消息。

分析:从末尾开始找到尽可能长的连续递增序列,再用总数减去。

View Code
#include <stdio.h>
#include <string.h>
int a[100005];
int main()
{
    int n, i, tot;
    while (scanf("%d",&n)!=EOF)
    {
        tot = 0;
        for (i=0; i<n; i++)
            scanf("%d",&a[i]);
        for (i=n-1; i>=0;--i)
            if (i==n-1 || (i!=n-1&&a[i]<a[i+1]))
                tot++;
            else break;
        printf("%d\n",n-tot);
    }
    return 0;
}

C.Magical Boxes

题意:有n个盒子,每个盒子的长度为2^k,一个盒子只有边长比另一个小才能放入,问最少需要多大的盒子能将这些盒子全装起来。

分析:将每个盒子分开考虑,求出能装下每种盒子的最大盒子。

View Code
#include <cstdio>
#define max(a,b) (a)>(b)?(a):(b)
int main()
{
    int p, n, i;
    int k, a;
    while (scanf("%d",&n)!=EOF)
    {
        p = 0;
        while (n--)
        {
            scanf("%d %d",&k,&a);
            if (a == 1){
                k++;
                p = max(p,k);
            }
            else{
                while (a && a!=1)
                {
                    if (a%4 == 0)
                        a /= 4;
                    else
                        a = a/4+1;
                    k++;
                }
                p = max(p,k);
            }
        }
        printf("%d\n",p);
    }
    return 0;
}

 D.Greenhouse Effect

题意:有m种花朵,知道了每种花的位置和编号,现在要把无序的花朵调整成有序的,同种花朵放在一起,问最少移动多少盆花。

分析:最长单调子序列变形,求出最长非递减子序列,然后用总数减去即可。

STL_upper_bound
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[5005];
int main()
{
    int i, j;
    int n, m, len, p;
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        len = 0;
        for (i=0; i<n; i++){
            scanf("%d%*s",&p);
            j = upper_bound(a,a+len,p)-a;
            a[j] = p;
            if (j==len)
                len++;
        }
        printf("%d\n",n-len);
    }
    return 0;
}
普通写法Nlog(n)
#include <stdio.h>
#include <string.h>
int b[5005];
int p[5005];
int bSearch(int num, int k)  {
    int low=1, high=k;
    while(low<=high)  {
        int mid=(low+high)/2;
        if(num>=b[mid])
            low=mid+1;
        else
            high=mid-1;
    }
    return low;
}
int n;
int LIS(){
    int k = 1;
    b[1] = p[1];
    for(int i=2; i<=n; ++i){
        if(p[i]>=b[k])
            b[++k] = p[i];
        else{
            int pos = bSearch(p[i], k);
            b[pos] = p[i];
        }
    }
    return k;
}
int main()
{
    int i,  m;
    while (scanf("%d %d",&n,&m)!=EOF)
    {
        for (i=1; i<=n; i++)
            scanf("%d %*s",&p[i]);
        printf("%d\n",n-LIS());
    }
    return 0;
}

 

相关文章: