贪心水题。UVA 11636 Hello World,LA 3602 DNA Consensus String,UVA 10970 Big Chocolate,UVA 10340 All in All,UVA 11039 Building Designing

UVA 11636 Hello World

二的幂答案就是二进制长度减1,不是二的幂答案就是是二进制长度。

#include<cstdio>

int main()
{
    int n,kas = 0;
    while(scanf("%d",&n),n>0){
        int r = 0;
        for(n--;n;n>>=1) r++;
        printf("Case %d: %d
",++kas,r);
    }
    return 0;
}

LA 3602 DNA Consensus String

贪心构造,每一位上选出现次数最多的。

#include<bits/stdc++.h>
using namespace std;
const int maxm = 55,maxn = 1e3+1;

int id[256];
char rid[] = "ACGT";
int ct[4][maxn];
char s[maxn+5];
int main()
{
    id['A'] = 0; id['C'] = 1; id['G'] = 2; id['T'] = 3;
    int T;cin>>T;
    while(T--){
        int m,n; scanf("%d%d",&m,&n);
        for(int i = 0; i < 4; i++) fill(ct[i],ct[i]+n,0);
        for(int i = 0; i < m; i++){
            scanf("%s",s);
            for(int j = 0; j < n; j++){
                ct[id[s[j]]][j]++;
            }
        }
        int sum = 0;
        for(int j = 0; j < n; j++){
            int k = 0;
            for(int i = 1; i < 4; i++) if(ct[i][j] > ct[k][j]) k = i;
            putchar(rid[k]); sum += m-ct[k][j];
        }
        printf("
%d
",sum);
    }
    return 0;
}

UVA 10970 Big Chocolate (等效转换)

题目问最少的刀数是迷惑人的,从块数来看,每次切只会增加一块巧克力。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int m,n;
    while(~scanf("%d%d",&m,&n)){
        printf("%d
",m*n-1);
    }
    return 0;
}

UVA 10340 All in All

贪心选,两个指针,t中的当前元素能选就选,不选这个元素对答案就没有贡献了,一定不会更优。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5;
char s[maxn],t[maxn];
int main()
{
    while(~scanf("%s%s",s,t)){
        char *p = s,*q = t;
        while(*p){
            while(*q && *q != *p) q++;
            if(!*q) break;
            p++; q++;
        }
        if(!*p) puts("Yes");
        else puts("No");
    }
    return 0;
}

UVA 11039 Building Designing 

贪心,按照绝对值排序,记录一下上次的符号,能选就选。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 5e5+5;
int a[maxn];
bool cmp(int a,int b) { return abs(a) < abs(b); }
int main()
{
    int T; cin>>T;
    while(T--){
        int n; scanf("%d",&n);
        for(int i = 0; i < n; i++) scanf("%d",a+i);
        sort(a,a+n,cmp);
        int ans = 1; bool fg = a[0]>0;
        for(int i = 1; i < n; i++){
            bool tfg = a[i]>0;
            if( (tfg&&!fg) || (!tfg&&fg) ) {
                fg = tfg; ans++;
            }
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/jerryRey/p/4809135.html