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;
}
}