这里写下ABCDE吧,这次思路感觉不是怎么很明确
传送门
主要思路:n/2即可
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 100010, M = 200010;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
int k = max(n/2,1);
printf("%d\n",k);
}
return 0;
}
主要思路:我们首先删除% 2 不是偶数的个数,然后判断下删除的数值,然后进行两两合并,让gcd == 2即可
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 100010, M = 200010;
int a[N];
int ans[N] ,res[N];
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
n *= 2;
for (int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
int x = 0, y = 0;
for (int j = 1; j <= n; j ++){
if (a[j] % 2 == 1) x++;
else y ++;
}
int xx =0 , yy = 0;
if (x % 2 == 1){
xx = 1;
yy = 1;
}
else{
if (x >= 2) xx = 2;
else yy = 2;
}
for (int i = 1; i <= n; i++){
if (xx && a[i] % 2 == 1){
a[i] = 0;
xx --;
}
if (yy && a[i] % 2 == 0 && a[i] != 0){
a[i] = 0;
yy --;
}
}
int cnt1= 0, cnt2= 0;
for (int i = 1; i <= n; i++){
if (a[i] && a[i] % 2 == 1){
ans[cnt1 ++] = i;
}
if (a[i] && a[i] % 2 == 0){
res[cnt2 ++] = i;
}
}
for (int i = 0; i < cnt1; i+= 2){
printf("%d %d\n",ans[i],ans[i + 1]);
}
for (int i = 0; i < cnt2; i += 2){
printf("%d %d\n",res[i],res[i + 1]);
}
}
return 0;
}
主要思路: 首先判断数值是否为奇数或者是2,如果是这样,那么Ashishgup肯定赢,否则再判断,如果是2^x 或者 该数不能被奇数除,那么FastestFinger赢,否则Ashishgup赢。
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 100010, M = 200010;
int main(){
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
if (n == 1){
puts("FastestFinger");
continue;
}
if (n % 2 == 1 || n == 2){
puts("Ashishgup");
}
else{
// 4 6 10 14
int xx = n;
while(xx % 2 == 0) xx/=2;
if (xx == 1){
puts("FastestFinger");
continue;
}
int x = 0;
for (int i = sqrt(n); i >= 2; i --){
if (n % i == 0){
if ((n / i) % 2 == 0 && (n / i) != 2){
x ++;
}
}
}
if (x) puts("Ashishgup");
else puts("FastestFinger");
}
}
return 0;
}
主要思路: 二分思想,找最大值中的最小值,也就是奇数偶数位上最大值中较小的值。那么我们直接二分,判断是否符合条件即可,这里的二分函数check十分的巧妙(看标程的)。
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 200010, M = 200010;
int a[N];
int n, k;
bool check(int x, int cur){
int num = 0;
for (int i = 1; i <= n; i ++){
if (!cur){
num ++;
cur ^= 1;
}
else{
if (a[i] <= x){
num ++;
cur ^= 1;
}
}
}
return num >= k;
}
int binsearch(){
int l = 1, r = 1e9;
while(l < r){
int mid = l + r >> 1;
if (check(mid,1) || check(mid,0)){
r = mid;
}
else{
l = mid + 1;
}
}
return l;
}
int main(){
scanf("%d%d",&n,&k);
for (int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
int res = binsearch();
printf("%d\n",res);
return 0;
}
主要思路: 我们要向右进行移动,那么如果我们的子序列是010101 或者 101010 的话,那么肯定是优的,那么我们尽量找出多组即可。
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int N = 100010, M = 200010;
int main(){
int n;
scanf("%d",&n);
string st1, st2;
cin>>st1;
cin>>st2;
int x = 0, y = 0, x1 = 0, x0 = 0, y1 = 0, y0 = 0;
for (int i = 0; i < n; i ++){
if (st1[i] != st2[i]){
if (st1[i] == '0'){
if (x1 > 0){
x1 --;
}
else if (y1 > 0){
y1 --;
}
else if (x - x0 - y0> 0){ // 判断是否有完成的子串
x0 ++;
}
else{
y0 ++;
x++;
}
}
else{
if (x0 > 0){
x0 --;
}
else if (y0 > 0){
y0 --;
}
else if ((y - x1 - y1) > 0){ // 判断是否有完成的子串
x1 ++;
}
else{
y1 ++;
y++;
}
}
}
}
if (x0 || x1 || y1 || y0) puts("-1"); // 有单独的(0 和 1的数目不相同)
else printf("%d\n",x + y);
return 0;
}