寒假训练一周总结
这一周开始参加学校的冬训,参加了几次比赛,有解出来的,也有一点头绪都没有的,经过这几次训练,我深深的感觉到自己的实力还有很大的不足,还有很多的知识没有学,希望我能认真学习这些知识(djstl,图等)
以下是我的参加的一些题目(有些题目没有展示出来,因为我还没有学会,学了之后补题再发),本篇主要是回顾做题的心路历程和解题思路。
- 训练赛1
- P1
没有太多好说的,我就把小写字母转化成大写就过了
代码如下
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main ()
{
char str[1000];
scanf("%s",str);
for(int i=0;str[i]!=0;i++)
{
if(str[i]>='a'&&str[i]<='z')
{
str[i]-=32;
}
}
printf("%s",str);
- P2
这道题我的思路就是找chuanzhi有多少个,也不难
代码如下
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int count=0;
char str[400001];
scanf("%s",str);
for(int i=0;str[i]!=0;i++)
{
if(str[i]=='c'&&str[i+1]=='h'&&str[i+2]=='u'&&str[i+3]=='a'
&&str[i+4]=='n'&&str[i+5]=='z'
&&str[i+6]=='h'&&str[i+7]=='i')
{
count++;
}
}
printf("%d",count);
}
- p3
这道题对我来说就比上面两道题难上许多,并不是知识点不够不会写,而是考虑的事情太多,可以思考一下这道题。
我一开始写的时候注意到闰年平年的问题就 - P4
这道题我没拿到100,只是90,我想应该是我的方法有问题,导致有一个点超时。
我的思路是通过观察题目可知需要找到两个值,且满足第一个数/第二个数的值一定就行,所以我自然而然就想到了二分法。
题目没有多难,可能是我方法问题,没有拿下100.
代码如下
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a1[10000001],a2[100000001];
ll n;
ll max,min,mid;
int check(int mid)
{
int s=0;
for(int i=1;i<=n;i++)
{
int ans =a1[i]/mid;
if(ans==a2[i])
s++;
else if(ans>a2[i])
return -2;
else
return -3;
}
if(s==n)
return 1;
else
return 0;
}
void find(int mid)
{
int ans1,ans2;
int max =mid;
int min =mid;
while(( ans1=check(max))!=0){
if(ans1==1)
max++;
else
{
max--;
break;
}
}
while((ans2 = check(min))!=0){
if(ans2==1)
min--;
else
{
min++;
break;
}
}
cout<<min<<" "<<max;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a1[i]>>a2[i];
}
ll l=0;
ll r=9999999999;
while(l<r)
{
mid=(l+r)/2;
int res =check(mid);
if(res==1)
{
find(mid);
return 0;
}else if(res==-2)
l=mid+1;
else if(res==-3)
r=mid-1;
}
}
- P5
这道题也没有太多好说的,就是单纯的数学问题,假如有n个,3个又可以换一个,那么多出来的数量就是n/3,
这时n的数量发生变化,变为原来的n/3个再加上不够三个剩下来的数量
代码如下\
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int main ()
{
int ans;
int n;
cin>>n;
ans=n;
while(n>2)
{
ans+=n/3;
n=(n/3)+(n%3);
}
cout<<ans;
return 0;
}
P6
这道题我的思路一开始两个嵌套循环,把所有的小于蛋糕宽或长里面的n全部算出来,然后累加,最后锁定最大那个数,代码如下
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll res[100001];
int n,m;
ll ans;
void ef(int x,int y)
{
for(int i=1;i<=min(x,y);i++)
{
res[i]+=(x/i)*(y/i);
}
}
void pd()
{
int max=1;
for(int i=1;i<=m;i++){
if(res[i]>=m)
{
ans=i;
}
}
cout<<ans;
}
int main ()
{
int a,b;
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a>>b;
ef(a,b);
}
pd();
}
不出意外,最后两个点rel了,然后换了一种思路,把每个n求出来算,用二分就可以解决
代码如下,
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
ll ans;
struct Node
{
int x;
int y;
}a[100001];
bool ef(int x)
{
int res=0;
for(int i=1;i<=n;i++)
{
res+=(a[i].x/x)*(a[i].y/x);
if(res>=m)
return true;
}
return false;
}
int pd(int l,int r)
{
while(l<r){
int mid =(l+r+1)>>1;
if(ef(mid))
l =mid;
else
r=mid-1;
}
return l;
}
int main ()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y;
}
cout<<pd(1,1000002);
return 0;
}
P7
这道题也不难就是基础的排序问题,你只需要找到从小到大不一样的数,然后冒泡排序的次数就是答案,代码如下
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int a[100000],b[100000];
int main ()
{
int ans =0;
int n;
int swap;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=i;
}
for(int i=1;i<=n;i++){
if(a[i]!=b[i])
{
for(int j=i+1;j<=n;j++)
{
if(a[j]==b[i])
{
swap=a[i];
a[i]=a[j];
a[j]=swap;
ans++;
}
}
}
}
cout<<ans;
}
- 训练赛2
- P1