A - The Miracle and the Sleeper
在[l,r]区间内找一对(a,b)使得 b % a 最大
solution:
if(l*2<=r)
{
if(r%2==0) cout<<r/2-1<<endl;
else cout<<r/2<<endl;
}
else
{
cout<<r-l<<endl;
}
AC code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N];
int main()
{
int T;
cin>>T;
//26 15 max = 11
//
while(T--)
{
int l,r;
cin>>l>>r;
if(l*2<=r)
{
if(r%2==0) cout<<r/2-1<<endl;
else cout<<r/2<<endl;
}
else
{
cout<<r-l<<endl;
}
}
return 0;
}
B - Scenes From a Memory
最多两位数就能满足要求 模拟一下即可
AC code
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int cnt[N];
int b[105];
int heshu[N]={10,12,15,20,21,22,25,27,30,32,33,34,35,36,38,39,40,42,44,45,46,48,49,50,51,52,54,55,56,57,58,60,62,63,64,65,66,68,69,70,72,74,75,76,77,78,80,81,82,84,85,86,87,88,90,91,92,93,94,95,96,98,99,100};
bool is_prime(int x) // 判定质数
{
if (x < 2) return false;
for (int i = 2; i <= x / i; i ++ )
if (x % i == 0)
return false;
return true;
}
int main()
{
int pos=0;
for(int i=10;i<=100;i++)
{
if(is_prime(i)==false) heshu[pos++]=i;
}
int T;
int i;
cin>>T;
while(T--)
{
int num;
char as[100];
int a[100];
memset(a,0,sizeof a);
memset(b,0,sizeof b);
scanf("%d",&num);
for(int i=1;i<=num;i++)
{
cin>>as[i];
a[i]=as[i]-48;
for(int j=1;j<i;j++)
if(a[j]!=0)
{
b[a[j]*10+a[i]]++;
}
}
bool st = false;
int res=0;
for(int i=1;i<=num;i++)
if(a[i]==1||a[i]==4||a[i]==6||a[i]==8||a[i]==9)
{
st=true;
res=a[i];
break;
}
if(st)
{
cout<<1<<endl;
cout<<res<<endl;
}
else
{
for(int i=0;i<=68;i++)
{
if(b[heshu[i]])
{
cout<<2<<endl;
cout<<heshu[i]<<endl;
break;
}
}
}
}
return 0;
}
C - Rings
- 前导 0
- 后导 0
- 取 n/2个1 和(n/2)* 2 个1
AC code
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
void solve()
{
int n;
cin>>n;
char s[20000+10];
for(int i=1;i<=n;i++)
cin>>s[i];
for(int i=1;i<=(n+1)/2;i++)
if(s[i]=='0')
{
printf("%d %d %d %d\n",i,n,i+1,n);
return ;
}
for(int i=n;i>=(n+1)/2;i--)
if(s[i]=='0')
{
printf("%d %d %d %d\n",1,i,1,i-1);
return ;
}
//printf("1 %d 1 %d\n",n-1,n);
cout << 1 << " " << (n / 2) * 2 << " " << 1 << " " << n / 2 << endl;
}
int main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
return 0;
}
D1 - Two Hundred Twenty One (easy version)
先按不删去电线杆看数值 观察找出规律
int k=sum[r]-sum[l-1];
if(abs(k)%2==1)puts("1");
else if(k==0)puts("0");
else puts("2");
AC code
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 3e5+10;
void solve()
{
int n,q;
char s[N];
int sum[N];
cin>>n>>q;
scanf("%s",s+1);
for(int i=1;i<=n;i++) sum[i]=sum[i-1]+(i%2?-1:1)*(s[i]=='+'?1:-1);
while(q--)
{
int l,r;
cin>>l>>r;
int k=sum[r]-sum[l-1];
if(abs(k)%2==1)puts("1");
else if(k==0)puts("0");
else puts("2");
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
solve();
}
return 0;
}