• Codeforces Round #262 (Div. 2)


    Codeforces Round #262 (Div. 2)

    A:水题。直接不断模拟就可以

    B:因为s(x)大小最大到1e9,所以数位和最多为81,这样仅仅要枚举s(x),就仅仅要枚举1到81就可以,然后在计算出x,推断是否符合,符合就加进答案

    C:二分高度,然后推断的时候for一遍,每次不符合的位置就去浇水。从左往右推一遍就可以

    D:构造。假设k >= 5, 那么就能够直接放偶数,奇数,偶数,奇数,因为偶数和偶数+1异或必定为1,所以这样放4个异或和就到最小的0了。然后k = 1,2。4都能够特判到,关键在于k = 3的情况下怎样去构造,事实上仅仅要找到l的最高位,记下这个数字为p,假设3 p不超过r就能够构造了,能够选l, l + p, 3 p构造出来就是0,假设不行。那么肯定选2个异或和为1是最优

    代码:

    A:

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    
    int n, m;
    
    int main() {
    	int ans = 0;
    	scanf("%d%d", &n, &m);
    	while (n >= m) {
    		ans += n - n % m;
    		int num = n / m;
    		n = n % m + num;
     	}
     	printf("%d
    ", ans + n);
     	return 0;
    }

    B:

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #include <set>
    #include <iostream>
    using namespace std;
    
    typedef long long ll;
    
    ll a, b, c;
    set<ll> ans;
    ll out[105], on = 0;
    
    ll pow1(ll x, ll k) {
    	ll ans = 1;
    	for (ll i = 0; i < k; i++)
    		ans *= x;
    	return ans;
    }
    
    bool judge(ll num, ll x) {
    ll sum = 0;	
     while (num) {
    		sum += num % 10;
    		num /= 10;
     }
     return sum == x;
    }
    
    int main() {
    	scanf("%lld%lld%lld", &a, &b, &c);
    	for (ll i = 0; i <= 81; i++) {
     		ll tmp = b * pow1(i, a) + c;
     		if (tmp > 0LL && tmp < 1000000000LL && judge(tmp, i))
     			ans.insert(tmp);
     	}
     	for (set<ll>::iterator it = ans.begin(); it != ans.end(); it++)
     		out[on++] = *it;
     		printf("%lld
    ", on);
    	for (ll i = 0; i < on - 1; i++)
    		printf("%lld ", out[i]);
    	if (on)
    		printf("%lld
    ", out[on - 1]);
    	return 0;
    }

    C:

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    using namespace std;
    
    typedef long long ll;
    const int N = 100005;
    const int INF = 1100000000;
    
    int n, m, w;
    int a[N], tmp[N];
    
    bool judge(int h) {
    	int cnt = 0;
    	memset(tmp, 0, sizeof(tmp));
    	for (int i = 0; i < n; i++) {
    		if (i) tmp[i] += tmp[i - 1];
    		if (a[i] + tmp[i] < h) {
    			int add = h - tmp[i] - a[i];
    			cnt += add;
    			tmp[i] += add;
    			tmp[min(i + w, n)] -= add;
    		}
    		if (cnt > m) return false;
    	}
    	return true;
    }
    
    int solve() {
    	int l = 0, r = INF;
    	while (l < r) {
    		int mid = (l + r) / 2;
    		if (judge(mid)) l = mid + 1;
    		else r = mid;
     	}
     	return l - 1;
    }
    
    int main() {
    	scanf("%d%d%d", &n, &m, &w);
     	for (int i = 0; i < n; i++)
      		scanf("%d", &a[i]);
    	printf("%d
    ", solve());
    	return 0;
    }

    D:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    typedef long long ll;
    
    ll l, r, ans[10];
    int k, an = 0;
    
    void build() {
        if (k == 1) ans[an++] = l;
        else if (k == 2) {
    	if (r - l + 1 == 2) {
    	    if (l < (l^r)) ans[an++] = l;
    	    else {ans[an++] = l; ans[an++] = r;}
    	}
    	else {
    	    if (l%2) l++;
    	    ans[an++] = l; ans[an++] = l + 1;
    	}
        }
        else if (k == 3) {
    	ll p = 1;
    	while (p <= l) p *= 2;
    	p /= 2;
    	if (3 * p <= r) {
    	    ans[an++] = l;
    	    ans[an++] = l + p;
    	    ans[an++] = 3 * p;
    	}
    	else {
    	    if (l%2) l++;
    	    ans[an++] = l;
    	    ans[an++] = l + 1;
    	}
        }
        else if (k == 4) {
    	if (r - l + 1 > 4) {
    	    if (l % 2) l++;
    	    for (an = 0; an < 4; an++)
    		ans[an] = l + an;
    	}
    	else {
    	    ll Min = l;
    	    ans[an++] = l;
    	    for (int i = 1; i < 16; i++) {
    		ll sum = 0;
    		for (int j = 0; j < 4; j++) {
    		    if (i&(1<<j)) sum ^= (l + j);
    		}
    		if (sum < Min) {
    		    Min = sum;
    		    an = 0;
    		    for (int j = 0; j < 4; j++) {
    			if (i&(1<<j))
    			    ans[an++] = (l + j);
    		    }
    		}
    	    }
    	}
        }
        else {
    	if (l % 2) l++;
    	for (an = 0; an < 4; an++)
    	    ans[an] = l + an;
        }
    }
    
    int main() {
        scanf("%lld%lld%d", &l, &r, &k);
        build();
        ll sum = 0;
        for (int i = 0; i < an; i++)
    	sum ^= ans[i];
        printf("%lld
    ", sum);
        printf("%d
    ", an);
        for (int i = 0; i < an - 1; i++)
    	printf("%lld ", ans[i]);
        printf("%lld
    ", ans[an - 1]);
        return 0;
    }


  • 相关阅读:
    Powerdesigner SqlServer转Oracle(转)
    ASP.NET jquery.uploadify上传控件中文乱码解决办法(转)
    网页上显示数学公式目前哪种方案最好? 来自知乎
    sql server 自增长id 允许插入显示值
    (转)【深入浅出jQuery】源码浅析2--奇技淫巧
    (转)js activexobject调用客户机exe文件
    搞笑代码注释,佛祖保佑 永无BUG
    json 递归查找某个节点
    c# string.format json字符串 formatException错误
    验证list的底层数据结构
  • 原文地址:https://www.cnblogs.com/cynchanpin/p/7301038.html
Copyright © 2020-2023  润新知