A: 小G的日常之ABABAB
思路:统计一下奇数位和偶数位,每个数字的个数,用总个数减去奇数位和偶数位出现最多的个数就是答案。
#include <bits/stdc++.h>
using namespace std;
int a[1005], b[100005], c[100005];
int main()
{
int n;
scanf("%d",&n);
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
if(i % 2 != 0) b[a[i]]++;
else c[a[i]]++;
}
int m1 = 0, m2 = 0;
for(int i = 0; i <= 100000; i++)
{
m1 = max(m1, b[i]);
m2 = max(m2, c[i]);
}
int ans = n - m1 - m2;
printf("%d\n",ans);
return 0;
}
B: 小G的日常之开关灯
思路:从左第一个关灯的位置开始按要求模拟即可。
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
int n; scanf("%d",&n);
for(int i = 0; i < n; i++)
scanf("%d",&a[i]);
int flag = 0, cnt = 0;
while(1)
{
flag = 0;
for(int i = 0; i < n; i++)
{
if(a[i] == 0)
{
for(int j = i; j < n; j++)
{
if(a[j] == 0) a[j] = 1;
else a[j] = 0;
}
cnt++;
}
}
for(int i = 1; i < n; i++)
{
if(a[i] == a[i-1] && a[i] == 1)
continue;
else flag = 1;
}
if(!flag) break;
}
printf("%d\n",cnt);
return 0;
}
C: 小G的日常之折扣票价
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
double a, b, c;
scanf("%lf%lf",&a,&b);
c = b / 2.0;
printf("%.2f",a+c);
return 0;
}
D: 小G的日常之签到
#include <bits/stdc++.h>
using namespace std;
int a[1005];
int main()
{
int a, b;
scanf("%d%d",&a,&b);
for(int c = a; c <= b; c++)
{
if(a * b * c % 2 != 0)
{puts("Yes"); return 0;}
}
puts("No");
return 0;
}
E: 小G的日常之算术题
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
char s[5][70]={"#####......#..#####..#####..#...#..#####..#####..#####..#####..#####","#...#......#......#......#..#...#..#......#..........#..#...#..#...#","#...#......#..#####..#####..#####..#####..#####......#..#####..#####","#...#......#..#..........#......#......#..#...#......#..#...#......#","#####......#..#####..#####......#..#####..#####......#..#####..#####"};
scanf("%d %d",&a,&b);
int ans = a + b;
int x[20], l = 0;
if(ans == 0)
{
x[0] = 0;
l++;
}
while(ans != 0)
{
x[l++] = ans % 10;
ans = ans / 10;
}
for(int j = 0; j < 5; j++)
{
for(int i = l - 1; i >= 0; i--)
{
if(x[i] == 0)
for(int k = 0; k < 5; k++)
printf("%c",s[j][k]);
if(x[i] == 1)
for(int k = 7; k < 12; k++)
printf("%c",s[j][k]);
if(x[i] == 2)
for(int k = 14; k < 19; k++)
printf("%c",s[j][k]);
if(x[i] == 3)
for(int k = 21; k < 26; k++)
printf("%c",s[j][k]);
if(x[i] == 4)
for(int k = 28; k < 33; k++)
printf("%c",s[j][k]);
if(x[i] == 5)
for(int k = 35; k < 40; k++)
printf("%c",s[j][k]);
if(x[i] == 6)
for(int k = 42; k < 47; k++)
printf("%c",s[j][k]);
if(x[i] == 7)
for(int k = 49; k < 54; k++)
printf("%c",s[j][k]);
if(x[i] == 8)
for(int k = 56; k < 61; k++)
printf("%c",s[j][k]);
if(x[i] == 9)
for(int k = 63; k < 68; k++)
printf("%c",s[j][k]);
if(i != 0)
printf("..");
}
printf("\n");
}
}
F: 小G的日常之股票
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t, n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int mx = 0, x;
for(int i = 0; i < n; i++)
{
scanf("%d",&x);
mx = max(mx, x);
}
printf("%d\n",mx);
}
return 0;
}
G: 小G的日常之游戏(二)
思路:用map映射一下,然后按要求模拟。
#include <bits/stdc++.h>
using namespace std;
map<string,int> mp;
int main()
{
int n, flag = 0;
scanf("%d",&n); string s, st, se;
cin >> s; mp[s]++; se = s[s.length()-1];
for(int i = 0; i < n - 1; i++)
{
cin >> s;
st = s[0];
if(st != se) flag = 1;
mp[s]++;
if(mp[s] > 1) flag = 1;
se = s[s.length()-1];
}
if(!flag) puts("Yes");
else puts("No");
return 0;
}
H: 小G的日常之烦心事
思路:式子化简一下就很容易了。
当a[j]-a[i]>0时,abs(a[j]-a[i])+j-i= a[j] - a[i] + j - i = (a[j] + j) - (a[i] + i)。
当a[j]-a[i]<0时,abs(a[j]-a[i])+j-i= a[i] - a[j] + j - i = (a[i] - i)-(a[j] - j)。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N];
int main()
{
int n, mx = 0, mi = N, sum;
scanf("%d",&n);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
for(int i = 1; i <= n; i++)
{
a[i] -= i;
mx = max(a[i],mx);
mi = min(a[i],mi);
}
sum = mx - mi; mx = 0, mi = N;
for(int i = 1; i <= n; i++)
{
a[i] += 2*i;
mx = max(a[i],mx);
mi = min(a[i],mi);
}
sum = max(sum, mx - mi);
printf("%d\n",sum);
return 0;
}
I: 小G的日常之游戏
思路:不知道为啥用string会超时,那就用char 直接模拟吧。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
char a[N];
int main()
{
cin >> a;
int len = strlen(a);
while(1)
{
int flag = 0, k = 0;
for(int i = 0; i < len - 1; i++)
{
if(a[i] != '*')
{
for(int j = i+1 ; j < len ; j++)
{
if(a[j] != '*')
{
k = j;
break;
}
}
if(a[i] == a[k])
{
a[i] = a[k] = '*';
flag = 1;
}
}
}
if(!flag) break;
}
for(int i = 0; i < len; i++)
if(a[i] != '*') cout << a[i];
}
J: 小G的日常之接雨水
思路:方法一从左扫一遍然后从右扫一遍,方法二双指针左右同时扫,现在只讲方法二,首先接雨水的多少肯定取决于最短柱子(木桶原理),我们维护左右两个最高的柱子,然后分别用两条指针,分别从两端向最高的柱子靠近,如果柱子大于前面柱子的最大值则不存在积水,小于则存在积水,积水量等于前面柱子的最大值减去此柱子高度。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6+10;
int main()
{
int n, a[maxn]; scanf("%d",&n);
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
int l = 0, r = n - 1, rmax = 0, lmax = 0;
ll ans = 0;
while(l < r)
{
lmax = max(lmax, a[l]);
rmax = max(rmax, a[r]);
if(lmax < rmax)
ans += lmax - a[l], l++;
else
ans += rmax - a[r], r--;
}
printf("%lld\n", ans);
return 0;
}