南昌不翻车 Codeforces Round #571 (Div. 2) C,D

http://codeforces.com/contest/1186

C:(挺好的思维题)

    题目大意:给俩串,A和B,然后A的每一个B子串,有一个价值,就是和B不同的数目,然后让统计偶数的代价有多少个。

    题目思路:由于异或存在交换律,所以,每次挪动,只需要把头的异或掉,然后把尾巴的异或回来,就行了。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e6+5;
char a[MAXN];
char b[MAXN];
int main()
{
    cin>>a+1;
    cin>>b+1;
    int ans = 0;
    int len_a = strlen(a+1);
    int len_b = strlen(b+1);
    int now = 0;
    for(int i=1;i<=len_b;i++){
        now ^= (a[i]-'0');
        now ^= (b[i]-'0');
    }
    if(now == 0)ans++;
    for(int i=len_b+1;i<=len_a;i++){
        now ^= (a[i]-'0');
        now ^= (a[i-len_b]-'0');
        if(now == 0)ans++;
    }
    cout<<ans<<endl;
}

D:D. Vus the Cossack and Numbers

题目大意:给n个数字,都是实数,每一个数字都上上取证或者向下取整,然后构造一种取法使得最后结果为0

题目思路:首先,如果是整数的话,就不能修改,否则全部向下取整,然后如果现在的和是个负数,就依次给这些数字+1。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN = 1e6+5;
const double eps = 1e-8;
double a[MAXN];
int ans[MAXN];
int main()
{
    int n;
    cin>>n;
    int num1 = 0,num2 = 0;
    int sum = 0;
    int sum2 = 0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        if(abs(a[i] - int(a[i])) < eps){
            sum += a[i];
            ans[i] = a[i];
            continue;
        }
        if(a[i] > 0){
            num1++;
            sum += int(a[i]);
            ans[i] = int(a[i]);
        }
        else {
            num2++;
            //cout<<int(a[i]-1)<<" * "<<endl;
            sum += (int)(a[i]-1);
            ans[i] = int(a[i]-1);
        }
    }
   // cout<<sum<<endl;
    int now = abs(sum);
    for(int i=1;i<=n;i++){
        if(abs(a[i] - int(a[i])) < eps){
            continue;
        }
        if(now){
            ans[i] ++;
            now--;
        }
    }
    for(int i=1;i<=n;i++){
        cout<<ans[i]<<endl;
    }
 
}

猜你喜欢

转载自blog.csdn.net/qq_41645482/article/details/102922157
今日推荐