【codeforces #91 div2】

来源:互联网 发布:热敏打印机排版软件 编辑:程序博客网 时间:2024/04/27 14:11

A,B水题。

C:暴力枚举l~r之间的lucky number,因为最多约有1500个lucky number,所以可以大胆暴力!

注意int溢出

#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout)#define N 100005LL min (LL a,LL b) {return a>b?b:a;}vector<LL> v;LL r;void dfs (LL x) {    LL y;    y=x*10+4;    v.push_back(y);    if(y>=r)return;    dfs(y);    y=x*10+7;    v.push_back(y);    dfs(y);}int main() {//FRE;    LL i,l,k;    while (scanf("%I64d%I64d",&l,&r)!=EOF) {        v.clear();        dfs(0);        sort(v.begin(), v.end());        LL num=0;        for (i = 0; i < v.size(); i++) {            if (l <= v[i] && l <= r) {                k = min(r,v[i]);                num += (k-l+1) * v[i];                l = v[i] + 1;            }        }        printf("%I64d\n",num);    }    return 0;}

D:找规律。因为447(第二个4在偶数位)与477(第一个4在奇数位)可以互相转化,所以可以根据此来减少复杂度。如果不构成这两个之一,就可以遍历完整个串,复杂度为O(n)。

#include <map>#include <set>#include <list>#include <queue>#include <deque>#include <stack>#include <string>#include <time.h>#include <cstdio>#include <math.h>#include <iomanip>#include <cstdlib>#include <limits.h>#include <string.h>#include <iostream>#include <fstream>#include <algorithm>using namespace std;#define LL long long#define MIN INT_MIN#define MAX INT_MAX#define PI acos(-1.0)#define FRE freopen("input.txt","r",stdin)#define FF freopen("output.txt","w",stdout)#define N 100005char str[N];int main(){//FRE;    int n,k;    scanf("%d%d%s",&n,&k,str);    int i,j;    int len = strlen(str);    int cnt = 0;    for (i = 0;k && i+1 < len; i++){        if (str[i] == '4' && str[i+1] == '7'){            k--;            if (i & 1){                str[i] = '7';                if (i > 0 && str[i-1] == '4'){                    if (k&1)str[i] = '4';                    break;                }            }            else{                str[i+1] = '4';            }        }    }    printf("%s\n",str);    return 0;}
E有空再看,睡觉去~

原创粉丝点击