A
这题其实自己画一下图可以发现当奇数行为每行都为W,偶数行为W与R交替出现,就可以得到满足题意的图形了。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n;
cin>>n;
for(int i=1;i<=n;i++){
if(i%2==1){
for(int j=1;j<=n;j++) cout<<'W';
cout<<endl;
}
else {
for(int j=1;j<=n;j++){
if(j%2==1) cout<<'W';
else cout<<'R';
}
cout<<endl;
}
}
}
signed main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
B
这题的思路就是你可以把它想象成找多少个不重复的线段区间,我们将每个区间按尾部端点大小进行排序,然后比较前一个区间的尾部和下一个区间的头部,若头部大于等于那个尾部,答案就加上1
点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct a{
int h;//每个区间的头和尾巴;
int t;
};
bool cmp(a&x,a&y){
return x.t<y.t;//让每个区间按尾部大小进行排序
}
int solu(vector<a>&ve){
if(ve.empty()) return 0;
int cnt=1;
int end=ve[0].t;
for(int i=1;i<ve.size();i++)
{
if(ve[i].h>=end)//后一个区间的头大于等于前一个区间的尾;
{
cnt++;
end=ve[i].t;
}
}
return cnt;
}
void solve()
{
int n,k;
cin>>n>>k;
vector<a>ve(k);
for(int i=0;i<k;i++){
cin>>ve[i].h>>ve[i].t;
}
sort(ve.begin(),ve.end(),cmp);
cout<<solu(ve);
}
int main()
{
int t=1;
while(t--){
solve();
}
}
C
这题将故事篇幅排序一下然后算一下前缀和,在通过upper_bound找到第一个大于该数的下标即可
点击查看代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
void solve()
{
ll n,k,a[N],sum[N],b[N];
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=k;i++) cin>>b[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+a[i];
}
for(int i=1;i<=k;i++)
{
ll m=upper_bound(sum,sum+n,b[i])-sum;
if(sum[m]<=b[i]) cout<<n<<" ";
else cout<<m-1<<" ";
}
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}
D
这题有几个点需要注意,开头必须是(,最后必须是 ),而且如果n为奇数就无法满足,题意应该是让我们验证正确的括号形式,(()()()()),((((()),正括号和反括号数量要相等,且从左往右数时反括号的数不能多于正括号,开一个计数指针,若计数为负数则不符合
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n,count1=0;
string s;
cin>>n;
cin>>s;
if(n%2==1) cout << "NO";
else{
for(int i=0;i<s.size();i++){
if(s[i]=='(') count1++;
if(s[i]==')') count1--;
if(count1<0){
cout<<"NO";
return ;
}
}
if(s[0]=='('&&s[s.size()-1]==')'&&count1==0){
cout<<"YES";
}
else cout<<"NO";
}
}
int main()
{
solve();
return 0;
}
E
要让总积分最高,那么只需要让队伍实力两两不相同即可,先给队伍实力按照升序排序,若下一个队伍的实力小于等于前一个队伍的实力,让下一个队伍等于前一个队伍的实力+1
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
void solve()
{
ll n,a[N],ans=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
for(int i=1;i<n;i++){
if(a[i]<=a[i-1]){
ans+=a[i-1]-a[i]+1;
a[i]=a[i-1]+1;
}
}
cout<<ans;
}
int main()
{
int t=1;
while(t--){
solve();
}
return 0;
}
F
高精度加法,模板题
点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
vector<int> add(vector<int>&A,vector<int>&B)
{
vector<int>C;
int t=0;
for(int i=0;i<A.size()||i<B.size();i++){
if(i<A.size()) t+=A[i];
if(i<B.size()) t+=B[i];
C.push_back(t%10);
t/=10;
}
if(t) C.push_back(t);
return C;
}
void solve()
{
string a,b;
cin>>a>>b;
vector<int>A,B;
for(int i=a.size()-1;i>=0;i--) {
A.push_back(a[i]-'0');
}
for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');
auto C=add(A,B);
for(int i=C.size()-1;i>=0;i--){
cout<<C[i];
}
}
int main()
{
int t=1;
while(t--){
solve();
}
return 0;
}
J
这一题虽然是分类讨论cax,xat,cxt,但是有很多细节需要注意,确保每个字母的顺序是对的,先讨论cax和cxt,再讨论xat,讨论cax时注意a不可以在最末尾,讨论cxt的时候注意t不可以在c的后面,讨论xat的时候把0位留给x,从第一位开始找
点击查看代码
#include <bits/stdc++.h>
using namespace std;
void solve()
{
int n,cntc=0,cnta=0,cntt=0,posa,posc,post;
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
//先整个扫一遍分类讨论ca,ct,at,cat;
if(s[i]=='c'&&cntc==0) {//找第一个c
cntc=1;
posc=i;
}
if(s[i]=='a'&&cntc==1&&cnta==0){//找第一个c后面的第一个a,cntc=1才标记,这个条件就有posa>posc了
cnta=1;
posa=i;
}
if(s[i]=='t'&&cntc==1) {//找第一个c后面的t
post=i;
cntt=1;
}
}
//cax
if(cntc&&cnta&&posa+1<s.size()){
cout<<posc+1<<" "<<posa+1<<" "<<posa+2;
}//cxt
else if(cntc&&cntt&&posc+1<post)//最低满足c后面第二位是t即可
{
cout<<posc+1<<" "<<posc+2<<" "<<post+1;
}
else {//xat
cnta=0,cntt=0;//记得重新标记一下
for(int i=1;i<s.size();i++) //从1开始第0个位置留给x
{
if(s[i]=='a'&&cnta==0){
cnta=1;
posa=i;
}
if(s[i]=='t'&&cnta==1){
cntt=1;
post=i;
break;
}
}
if(cntt&&cnta){
cout<<1<<" "<<posa+1<<" "<<post+1;
return;
}
cout<<-1;
}
}
int main()
{
int t=1;
while(t--)
{
solve();
}
return 0;
}