A.模拟
#include <iostream>
using namespace std;
int n, d, ans;
int a[105];
int main(){
cin >> n >> d;
for(int i = 1; i <= n; i++)
cin>> a[i];
ans += 2;
for(int i = 2; i <= n; i++){
if(a[i] - a[i-1] == 2*d)
ans++;
if(a[i] - a[i-1] > 2*d)
ans += 2;
}
cout << ans;
return 0;
}
B.由均值不等式,直接输出0101…或1010….即可
#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int n, m, l, r;
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++){
scanf("%d %d", &l, &r);
}
for(int i = 1; i <= n; i++){
if(i & 1)
printf("0");
else
printf("1");
}
printf("\n");
return 0;
}
C. 模拟
按照一般想法,从前往后,对每个数字,其后面的数字都可以与之配对。
但这样是有重复的。
所以处理出每个数(不同的)后面不同的数有几个。答案加上即可。
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int a[100005];
int ans[100005];
bool v1[100005];
bool v2[100005];
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
}
int sum = 0;
for(int i = n; i >= 1; i--){
ans[i] = sum;
if(! v2[ a[i] ]){
v2[a[i]] = true;
sum++;
}
}
long long cnt = 0;
for(int i = 1; i <= n; i++){
if(! v1[a[i]]){
v1[a[i]] = true;
cnt += ans[i];
}
}
printf("%I64d\n", cnt);
return 0;
}