A. Division?
分析
根据题目要求,条件输出
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e5+10;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int r;
cin>>r;
if(r>=1900)
{
cout<<"Division 1"<<endl;
}
else if(r>=1600&&r<=1899)
{
cout<<"Division 2"<<endl;
}
else if(r>=1400&&r<=1599)
{
cout<<"Division 3"<<endl;
}
else cout<<"Division 4"<<endl;
}
return 0;
}
B. Triple
分析
输出任一至少出现过3次的数,否则输出-1
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
int ans=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+1+n);
int f=0;
for(int i=1;i<=n-2;i++)
{
if(a[i]==a[i+1]&&a[i]==a[i+2])
{
ans=a[i];
f=1;
break;
}
}
if(!f) cout<<"-1"<<endl;
else cout<<ans<<endl;
}
return 0;
}
C. Odd/Even Increments
分析
你可以任意次对奇数位或偶数位+1,判断最后的数组是否能够变成全奇或者全偶。
直接判断奇数位和偶数位的奇偶性。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e3+10;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
int f1,f2;
int ff1=1,ff2=1;
if(a[1]%2==1) //奇数位
{
f1=1;
}
else f1=0;
for(int i=3;i<=n;i+=2)
{
if(f1==1) //奇数
{
if(a[i]%2==0)
{
ff1=0;
break;
}
}
else { //偶数
if(a[i]%2==1)
{
ff1=0;
break;
}
}
}
if(a[2]%2==1) //偶数位
{
f2=1;
}
else f2=0;
for(int i=4;i<=n;i+=2)
{
if(f2==1) //奇数
{
if(a[i]%2==0)
{
ff2=0;
break;
}
}
else { //奇数
if(a[i]%2==1)
{
ff2=0;
break;
}
}
}
int f=1;
if(!ff1||!ff2)
{
f=0;
}
if(f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
D. Colorful Stamp
分析
给一些格子,每次可以对格子进行盖章,将格子变为RB或者BR,盖章结果可以覆盖。判断给出的结果是否可以通过盖章获得。
找规律,发现被盖章的一段只要同时有B和R这个就是可以获得的。然后只需要注意一些细节、、、
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e3+10;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
string s;
cin>>s;
int f=1;
int f1=0,f2=0;
if(n==1&&s[0]!='W')
{
cout<<"NO"<<endl;
continue;
}
int f3=0;
int cnt=0;
if(s[0]=='W') f3=1;
for(int i=0;i<s.size();i++)
{
if(s[i]=='B') f1=1,f3=0;
if(s[i]=='R') f2=1,f3=0;
if(s[i]=='W')
{
cnt++;
if(f3==1) continue;
if(f1==1&&f2==1)
{
f1=0;
f2=0;
}
else {
f=0;
}
f3=1;
//cout<<f<<" "<<i<<endl;
}
}
if(s[n-1]!='W')
{
if(f1==0||f2==0)
{
f=0;
}
}
if(cnt==n) f=1;
if(f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
E. 2-Letter Strings
分析
n个由a到k组成的长度为2的字符串,求有且仅有一个字符相同的组数。
只有12个字母,最多12*12个组合,对每一个计数即可。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=1e3+10;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int a[maxn][maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
ll ans=0;
memset(a,0,sizeof(a));
char x,y;
for(int j=0;j<n;j++)
{
cin>>x>>y;
for(int i='a';i<='k';i++)
{
if(i!=y) ans+=a[x][i];
if(i!=x) ans+=a[i][y];
}
a[x][y]++;
}
cout<<ans<<endl;
}
return 0;
}
F. Eating Candies
分析
n堆糖果,Alice只能从左边开始吃,Bob只能从右边开始吃,一堆被吃过就不能被另一个人吃,每人吃的总数必须相同,输出,最多可以被吃掉多少堆。
用前缀和记录Alice吃的数目,用后缀和记录Bob吃的数目,枚举,二分
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=2e5+10;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int w[maxn],pre[maxn],lat[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int ans1=0,ans2=0;
int cnt1=0,cnt2=0;
for(int i=1;i<=n;i++)
{
cin>>w[i];
pre[i]=w[i];
lat[i]=w[i];
}
for(int i=2;i<=n;i++)
{
pre[i]+=pre[i-1];
}
for(int i=n-1;i>=1;i--)
{
lat[i]+=lat[i+1];
}
int maxx=0;
int flag=0;
for(int i=n;i>=0;i--)
{
int l=i+1,r=n;
int ex=pre[i];
while(l<r)
{
int mid=(l+r)/2;
if(lat[mid]>ex) l=mid+1;
else r=mid;
}
if(lat[l]==ex&&i<l)
{
maxx=max(maxx,i+n-l+1);
}
}
cout<<maxx<<endl;
}
return 0;
}
G. Fall Down
分析
o是障碍物,*除非遇到障碍物都会掉落,输出最后掉落后的图。
数据很小,直接模拟暴力
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=100;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
char g[maxn][maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>g[i][j];
}
}
for(int j=0;j<m;j++)
{
int tt=n-1;
for(int i=n-1;i>=0;i--)
{
if(g[i][j]=='o') tt=i-1;
else if(g[i][j]=='*')
{
swap(g[i][j],g[tt][j]);
tt--;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<g[i][j];
}
cout<<endl;
}
}
return 0;
}
H. Maximal AND
分析
贪心。
在k次操作以内,我们要让n个数的位与和最大,位与后结果过只能为0或1,所以我们要尽可能让高位的都为1,这样大家位与以后这个二进制位上才为1,所以我们尽可能从高位去让所有数的二进制位都为1。所以我们要去找每一位二进制位上有多少个数在这个位上为0,然后利用贪心的思想让高位为1
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll maxn=100;
const ll mod=32768;
const ll INF=0x3f3f3f3f;
const double pi=acos(-1);
int main()
{
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
vector<int> cnt(31,0),a(n);
for(int i=0;i<n;i++)
{
cin>>a[i];
for(int j=30;j>=0;j--)
{
if(a[i]&(1<<j)) ++cnt[j];
}
}
int ans=0;
for(int i=30;i>=0;--i)
{
int m=n-cnt[i];
if(m<=k)
{
k-=m;
ans+=(1<<i);
}
}
cout<<ans<<endl;
}
return 0;
}