总结:
缺点:
- 英语阅读不行。
- 题目做得太少,A题一开始看不懂,还以为是求回文串,做完B才知道是字典序问题。
- 没有考虑下标问题,输出没处理好。
- 知识点薄弱(dp)。
A - Reverse a Substring
思路:问是否可以颠倒两个字符使出现字典序更小的串,遍历保存字典序较大的字符即可,当出现字典序更小的字符交换 然后输出结束程序,如果循环结束还没结束就输出no。
wa问题:没注意下标直接输出cc和i ,需要+1。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
const int manx=1e5+5;;
int main()
{
string s;
int n;
cin>>n>>s;
char c=s[0];
int cc=0;
for(int i=1;i<n;i++)
{
if(c>s[i]){
put1();
cout<<cc+1<<" "<<i+1<<endl;
return 0;
}
if(s[i]>c) c=s[i],cc=i;
}
put2();
return 0;
}
B - Game with Telephone Numbers
思路:求能否赢只需要判断后十个数字以外的’8’的数量和其他数字的数量。
当8的数量大于其他的数量时,V赢;否则P赢。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
const int manx=1e5+5;;
int main()
{
string s;
int n;
cin>>n>>s;
int a=0,b=0;
for(int i=0;i<n-10;i++)
if(s[i]=='8') a++;
else b++;
if(a>=b+1) put1();
else put2();
return 0;
}
C - Alarm Clocks Everywhere
思路:给一个闹钟,要求在一定时间点能够响起,只需要求每个时间点减去第一次响的时间(即求她们的间隔)的最大公约数ans,这样保证每个时间点都可以响起来,然后遍历p数组如果存在一个数的倍数是ans,那么这个数就是答案。
例如 3 12 18 差值 9 15 最大公约数 3 那么只要一个数的倍数是3 那么这个数就可以转化成3 随后可以把3转换成 差值 9和15 3就可以变成12 18。
wa问题:没考虑倍数关系,第一次直接遍历p 当ans==p[i] 就输出了答案。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
const int manx=3e5+5;;
ll a[manx];
int main()
{
ll n,m;
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
ll y=a[1],flag=0,b;
ll ans=0;
for(int i=2;i<=n;i++) ans=__gcd(a[i]-a[1],ans);
for(int i=1;i<=m;i++){
b=read();
if(ans%b==0) flag=i; //if(ans==b) wa了一发
}
if(flag){
put1();
cout<<y<<" "<<flag<<endl;
}
else put2();
return 0;
}
D - Beautiful Array
思路:简单dp,分三种情况,一种还没乘m ,一种正在乘m,一种已经乘m。
wa问题:求最小连续段和最大连续段,分情况整个子段*m,不知道为啥wa。
#include<bits/stdc++.h>
#define ll long long
#define R register int
#define inf 0x3f3f3f3f
#define mod 1000000007;
using namespace std;
inline ll read(){
ll s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put1(){ puts("YES") ;}
void put2(){ puts("NO") ;}
const int manx=3e5+5;;
ll a[manx],dp[manx];
int main()
{
ll n,m,ans=-inf;
n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
dp[0]=max((ll)0,dp[0]+a[i]);
dp[1]=max(dp[0],dp[1]+a[i]*m);
dp[2]=max(dp[1],dp[2]+a[i]);
ans=max(ans,dp[2]);
}
cout<<ans<<endl;
return 0;
}