03.07-03.14学习总结

这周是进入实验室的第一周,在这周,了解了实验室的基本规章制度,然后还有平时的任务之类的,然后打了两次cf,熟悉了一下cf的题型,一般cf前三个题都是结论题,经常想不出就在那一直卡,然后打了两次都只做出一道题,结果不是很理想,然后还补了cf的题目,

#cf776

b题,

结论题,选择该公式的最大值时,我们可以选择取r-r%a-1,和r,l中的值进行选择,选择其中最大的一个值,同时我们还要注意在取r-r%a-1时,这个值是否超出边界,超出边界就不能选这个值。

#include<bits/stdc++.h>
using namespace std;
 
int main()
{
    int n;
    cin>>n;
    while(n--){
            long long l,r,a;
        cin>>l>>r>>a;
        long long Max1=max(r/a+r%a,l/a+l%a);
        long long k=r-r%a-1;
        long long Max2=k/a+k%a;
        if(l<=k) cout<<max(Max1,Max2)<<endl;
        else cout<<Max1<<endl;
    }
}

c题

就是排两遍序,一遍按权值排序,取前2*n个再进行下标排序。

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int pos;
    int x;
    int w;
}num[200001];
 
bool cmp1(node a,node b)
{
    return a.w<b.w;
}
 
bool cmp2(node a,node b)
{
    return a.x<b.x;
}
 
int main()
{
    int t;
    cin>>t;
    while(t--){
            long long sum=0;
        int n,m;
        cin>>n>>m;
        for(int i=0;i<m;i++){
            cin>>num[i].x>>num[i].w;
            num[i].pos=i+1;
        }
        sort(num,num+m,cmp1);
        for(int i=0;i<2*n;i++){
            sum+=num[i].w;
        }
        sort(num,num+2*n,cmp2);
        cout<<sum<<endl;
        for(int i=0;i<n;i++){
            cout<<num[i].pos<<' '<<num[2*n-i-1].pos<<endl;
        }
 
 
    }
}

 

D题

为了使移动次数最少,我们可以先从最大值开始移动,移动到合适位置时定下这个点,然后再移动剩下的数里面的最大值,即可使移动次数最小直到移动到1时停止移动。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int num[2001];
        for(int i=0;i<n;i++){
            cin>>num[i];
        }
        int Max=0;
        int mp[2001];
        int k=n;
        int pos;
 
        for(int i=n;i>=1;i--){
            pos=0;
            for(int j=0;j<i;j++){
                if(num[j]==i) pos=j;
            }
            int aa[2001];
            for(int j=0;j<i;j++){
                aa[(i - 1 - pos + j) % i]=num[j];
            }
            for(int j=0;j<i;j++){
                num[j]=aa[j];
            }
            if(i!=1) mp[i-1]=(pos+1)%i;
            else mp[i-1]=0;
        }
        for(int i=0;i<n;i++){
            cout<<mp[i]<<" ";
        }
        cout<<endl;
    }
}

 

#124

结论题,当为3的n次方时,他的说法不成立。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int k;
        int flag=0;
        for(int i=0;i<n;i++){
            k=pow(3,i);
             if(k>=1e9){
                    flag=1;
             break;
 
        }
        }if(flag==1)cout<<"NO"<<endl;
 
        else{
            cout<<"YES"<<endl;
            long long x;
            for(int i=0;i<n;i++){
                    int x=pow(3,i);
                    cout<<x<<" ";
                    if(i==n-1) cout<<endl;
            }
 
        }
    }
}

 

然后打了天梯,感觉自己经常卡在一些很基础地方,所以导致有些应该做出来的题目做不出来,然后发现自己虽然学过了数据结构,但是出数据结构的题自己照样还是写不出来,挺不应该的,打算以后再认真复习一下数据结构的内容,夯实基础,下次天梯争取能多做一点题目。

算24

n个数算24,必有两个数要先算。这两个数算的结果,和剩余n-2个数,就构成了n-1个数求24的问题,然后枚举出所有的运算情况。
然后因为是double型所以不能用 ==

#include<bits/stdc++.h>
using namespace std;
double num[4];
#define EPS 1e-6;
bool same(double x)
{
   return fabs(x) <= EPS;
}
bool Count(double *num,int n)
{
    if(n==1) {
        if(same(num[0]-24)) return true;
        else return false;
    }
    double aa[5];
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            int ans=0;
            for(int k=0;k<n;k++){
                if(k!=i&&k!=j){
                    aa[ans++]=num[k];
                }
            }
                aa[ans]=num[i]+num[j];
                if(Count(aa,ans+1)) return true;
                aa[ans]=num[i]-num[j];
                if(Count(aa,ans+1)) return true;
                aa[ans]=num[j]-num[i];
                if(Count(aa,ans+1)) return true;
                aa[ans]=num[i]*num[j];
                if(Count(aa,ans+1)) return true;
                if(!same(num[j])){
                    aa[ans]=num[i]/num[j];
                    if(Count(aa,ans+1)) return true;
                }
                if(!same(num[i])){
                    aa[ans]=num[j]/num[i];
                    if(Count(aa,ans+1)) return true;
                }
        }
    }
    return false;
}
int main()
{
    while(1){
        double num[4];
        for(int i=0;i<4;i++){
            cin>>num[i];
        }
        if(num[0]==0&&num[1]==0&&num[2]==0&&num[3]==0){
        break;}
       // if(Count(num[0])) cout<<"YES"<<endl,break;
        if(Count(num,4)) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;

    }
}

最长上升子序列

DP问题

 for(int i=0;i<n;i++){
        for(int j=0;j<i;j++){
            if(num[i]>num[j]){
                vis[i]=max(vis[i],vis[j]+1);
            }
        }  len=max(len,vis[i]);
    }

 7-9 h0136. 在线翻译

开始因为输入要求后跟一个空白行卡了很久,然后也学习到了 可以用while(getline(cin,s)&&s!=""){

输入解决,getline可以输入空格,当字符串为空时循环输入结束。

7-7 h0093. 字符串最大跨距 

 因为用cin或者其他输入方式时,逗号会被字符串吸收掉,我们可以用

scanf("%[^,],%[^,],%s",s,s1,s2);

来解决,如果用其他的符号分隔也是可以的,注意中间要用逗号隔开。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值