1. 个人总结前言 这次小白月赛也算是一个教训,检验出了很多常见问题和不好的习惯 , 如下
- 喜欢每个测试点memset(a,0,sizeof(a))而导致超时 , 代码写的比较复杂而不考虑尽可能简略以减少错误
- 读题一掠而过,长一些的题目很经常读错导致代码写错 1,2两个问题集中体现在第一题和第二题中
- 对于精度问题总是不注意,体现在C题,之后尽量把精度问题都成10至整数再写(多次犯病) 相信大多数选手也会偶尔犯如上错误,于是乎在提交几次后过不去导致心态崩裂进而开摆
A 深渊水妖*
- 最开始设置了len(区间长度),对于len>=2的区间再进一步统计,但是这道题好像l==r的情况也包含在测试点内? 故一直过不去,后把len去掉,将所有递增区间全部放入结构体数组中,进行排序
bool cmp(node a,node b){
if(a.num!=b.num)return a.num>b.num;
else return a.left<b.left;
}
using namespace std;
const int N = 1e5+ 8;
typedef long long ll;
int n,a[N],t;
struct node{
int num,left,right;
};
bool cmp(node a,node b){
if(a.num!=b.num)return a.num>b.num;
else return a.left<b.left;
}
int main()
{
scanf("%d",&t);
while(t--){
vector<node>vv;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
int l=1,maxx=0;
for(int i=2;i<=n;i++){
if(a[i]<a[i-1]) {
vv.push_back({a[i-1]-a[l],l,i-1});
maxx = max(a[i-1]-a[l],maxx);
l=i;
}
}
vv.push_back({a[n]-a[l],l,n});
maxx = max(maxx,a[n]-a[l]);
sort(vv.begin(),vv.end(),cmp);
for(int i=0;i<vv.size();i++){
if(vv[i].num==vv[0].num)cout<<vv[i].left<<' '<<vv[i].right<<' ';
else break;
}
printf("\n");
}
return 0;
}
所以大家还是尽可能先一句话总结题目并简略代码思路后再写
C 绝命沙虫
- 主要是精度问题,化整后即可过
using namespace std;
typedef long long ll;
ll n,t,ans,inf = 10000;
double m;
int main()
{
cin>>t;
while(t--){
cin>>n>>m;
ans=0;
ll num = n,a=0,b=0;//a是红,b是绿
ll mm=m*10;
while(num){
a=num*100;
b=min(inf,num*10*(mm-10));
ans+=floor(a/10);
ans+=floor(b/10);
num=floor(a/200);
}
cout<<ans<<endl;
}
return 0;
}
D丛林木马
- 易发现a的每一位都要加上b的所有位 即可先用sum存储b所有位数*fastpow(10,lb-i-1)的和 a中每一位加上b每一位的全过程 a这一位贡献了lb次(b的位数)故
- 核心代码
for(int i=0;i<la;i++){
ll now = (a[i]-'0')*fastpow(10,la-i-1)%mod;
ans=(ans+now)%mod;
}
ll sum = 0;
for(int i=0;i<lb;i++){
ll now = (b[i]-'0')*fastpow(10,lb-i-1)%mod;
now=(now*la+ans)%mod;
sum=(sum+now)%mod;
}
整体代码
using namespace std;
const int N = 1e5 + 8;
typedef long long ll;
int t;
const int mod = 998244353;
ll fastpow(ll base,ll pow){
ll res = 1;
while(pow){
if(pow&1){
res=res*base%mod;
}
base=base*base%mod;
pow>>=1;
}
return res%mod;
}
void solve(){
string a,b;
cin>>a>>b;
int la=a.size(),lb=b.size();
if(la>lb){
swap(a,b);
swap(la,lb);
}
ll ans = 0;
for(int i=0;i<la;i++){
ll now = (a[i]-'0')*fastpow(10,la-i-1)%mod;
ans=(ans+now)%mod;
}
ll sum = 0;
for(int i=0;i<lb;i++){
ll now = (b[i]-'0')*fastpow(10,lb-i-1)%mod;
now=(now*la+ans)%mod;
sum=(sum+now)%mod;
}
cout<<sum<<endl;
}
int main()
{
cin>>t;
while(t--){
solve();
}
return 0;
}