依然一题都没做出来,我太菜了,心态炸了啦,后悔大一没入ACM坑,哈哈,说不定现在自己就不慌了呢。
ps:感谢大佬们提供训练的机会。
第一题 我想去上学嘛!
题意
公交车有时
a
a
a分钟来一趟,有时
b
b
b分钟来一趟,且概率相等;而乘客每分钟都增加一位。
问主人公等的那趟车来的时候平均有多少人在候车?
思路
代码
#include "bits/stdc++.h"
using namespace std;
int main() {
int T; cin>>T;
while(T--) {
double a, b; cin>>a>>b;
printf("%.2f\n", (a*a+b*b)/(a+b));
}
}
反思
- 没看懂,佛了佛了,先跳过
第二题 又拿01串出题?
题意
给定一个
01
01
01串,可以将最多一个子串内的
0
0
0变成
1
1
1,
1
1
1变成
0
0
0。
问变换后 01 01 01串中 1 1 1最多有多少个?
思路
其实这就是一个动态规划求【最大连续子序列和】的问题!!!
代码
标准题解代码
#include "bits/stdc++.h"
using namespace std;
char s[1000007];
int main() {
int T; cin>>T;
while(T--) {
scanf("%s", s+1);
int ans=0, tmp=0, sum=0, n=strlen(s+1);
for(int i=1; i<=n; ++i) {
sum+=s[i]=='1'; //记录原串总共有多少1
if(s[i]=='0') tmp++;
else tmp--;
ans=max(ans,tmp); //不断更新最大增量
if(tmp<0) tmp=0; //小贪心
}
cout<<ans+sum<<endl;
}
}
我的代码
//最大连续子序列和
#include "bits/stdc++.h"
using namespace std;
const int maxn = 1e5+10;
int main(){
//dp数组
int dp[maxn] = {0};
//存放数字1或者-1
int array[maxn] = {0};
//字符数组
char s[maxn];
int T;
scanf("%d",&T);
while(T--){
scanf("%s",s+1);
int cnt=0;
int ans = 0;
dp[0] = -100;
int len = strlen(s+1);
//数组下标从1开始
for(int i=1;i<=len;i++){
if(s[i] == '0'){
array[i] = 1;
}else{
array[i] = -1;
//记录1的个数
cnt++;
}
dp[i] = max(dp[i-1]+array[i],array[i]);
ans = max(dp[i],ans);
}
printf("%d\n",cnt+ans);
}
return 0;
}
反思
- 磨了很久才发现是最大连续子序列和的问题,而且我还忘记模板是什么了。唉,果然我是死记硬背算法的。。。;
- 另外,如果超时的话,要检查是不是有太多无效操作,比如每次循环都是用
strlen()
而不是使用一个变量len
存储起来; - 加油,路漫漫。。。
第三题 到底难还是简单呢?
题意
思路
代码
标准题解代码
#include "bits/stdc++.h"
using namespace std;
const int maxn = 3e5+7;
int n, m;
int a[maxn];
int main() {
int T; cin>>T;
while(T--) {
cin>>n>>m;
for(int i=1; i<=n; ++i) cin>>a[i];
if(n>m) { printf("0\n"); continue; }
int ans=1;
for(int i=1; i<=n; ++i) {
for(int j=i+1; j<=n; ++j) {
ans=ans*(abs(a[i]-a[j])%m)%m; //注意爆int
}
}
cout<<ans<<endl;
}
}
反思
- 利用取模的四则运算特性;
- 利用所有数模正数m只能只能得到m个结果!!!
- 没有想到。。。