week1 Div2

  1. 特殊的正方形

思路:简单的模拟题。

代码:

#include<bits/stdc++.h>
using namespace std;
char mapp[1001][1001];
int n;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            mapp[i][j]='0';
        }
    }
    for(int i=1;i<=n/2+1;i++){
        for(int j=i;j<=n-i+1;j++)mapp[i][j]=mapp[j][i]=(i%2==0?'.':'+');
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(mapp[i][j]!='0')cout<<mapp[i][j];
            else cout<<mapp[n-i+1][n-j+1];
        }
        cout<<endl;
    }
    return 0;
} 
  1. 走楼梯。

思路:思路与普通的走楼梯相同,只不过被细分为更加精细的状态。

代码:

#include<bits/stdc++.h>
using namespace std;
long long f[1000][3];//f[i][j]表示在i阶已经用2走了几次 
int main(){
    int n;
    cin>>n;
    f[1][0]=1;
    f[2][0]=1,f[2][1]=1;
    for(int i=3;i<=n;i++){
        f[i][0]=f[i-1][0]+f[i-1][1]+f[i-1][2];
        f[i][1]=f[i-2][0];
        f[i][2]=f[i-2][1];
    }
    cout<<f[n][0]+f[n][1]+f[n][2];
    return 0;
}
  1. 走路。

思路:本质上是一种带有状态的拓展。用book标记状态。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[100010],b[100010],book[100010];
int n,m;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
    book[a[1]]=book[b[1]]=1;
    for(int j=2;j<=n;j++){
        for(int i=100000;i>=0;i--){
            if(i-a[j]>=0 && book[i-a[j]]==j-1)book[i]=j;
            if(i-b[j]>=0 && book[i-b[j]]==j-1)book[i]=j;
        }
        //for(int i=1;i<=m;i++)cout<<book[i]<<" ";
        //cout<<endl;
    }
    for(int i=0;i<=m;i++){
        if(book[i]==n)cout<<'1';
        else cout<<"0";
    }
    return 0;
}
  1. 简单的分数统计。

思路:简单的map模拟。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,k,ce;
map<string, int>EVA;
map<string, int>ti;
string name[1000];
int main(){
    cin>>n>>k>>ce;
    for(int i=1;i<=n;i++)cin>>name[i],EVA[name[i]]=0;
    for(int i=1;i<=k;i++){
        int a;
        string str;
        cin>>str>>a;
        ti[str]=a;
    }
    for(int i=1;i<=ce;i++){
        string s1,s2,s3;
        cin>>s1>>s2>>s3;
        EVA[s1]+=(s3=="AC"?ti[s2]:0);
    }
    for(int i=1;i<=n;i++){
        cout<<name[i]<<" "<<EVA[name[i]]<<endl;
    }
    return 0;
}
  1. 德州扑克。

思路:建议使用函数来封装判断函数。

代码:

#include<bits/stdc++.h>
using namespace std;
int dian[100010];
int hua[100010];
int n;
bool lian(){
    for(int i=1;i<=n-1;i++){
        if(dian[i+1]-dian[i]!=1)return 0;
    }
    return 1;
}
bool tonghua(){
    for(int i=1;i<=n-1;i++){
        if(hua[i+1]-hua[i]!=0)return 0;
    }
    return 1;
}
bool sitiao(){
    int book[100];
    memset(book,0,sizeof(book));
    for(int i=1;i<=n;i++){
        book[dian[i]]++;
    }
    for(int i=1;i<=n;i++){
        if(book[dian[i]]>=4)return 1;
    }
    return 0;
}
bool hulu(){
    int book[100];
    bool S_2=0;
    bool S_3=0;
    memset(book,0,sizeof(book));
    for(int i=1;i<=n;i++){
        book[dian[i]]++;
    }
    for(int i=1;i<=n;i++){
        if(book[dian[i]]==3)S_3=1;
        if(book[dian[i]]==2)S_2=1;
    }
    return S_3&&S_2;
}
int main(){
    n=5;
    for(int i=1;i<=n;i++)cin>>dian[i];
    for(int i=1;i<=n;i++)cin>>hua[i];
    if(lian() && tonghua() && dian[n]==14)cout<<"ROYAL FLUSH";
    else if(lian() && tonghua())cout<<"STRAIGHT FLUSH";
    else if(sitiao())cout<<"FOUR OF A KIND";
    else if(hulu())cout<<"FULL HOUSE";
    else if(tonghua())cout<<"FLUSH";
    else if(lian())cout<<"STRAIGHT";
    else cout<<"FOLD";
    return 0;
} 
  1. 订单编号。

思路:简单的二分查找+跳跃优化。

代码:

#include<bits/stdc++.h>
using namespace std;
int cnt=0;
int ce[500010],a[500010];
int main(){
    int N;
    cin>>N;
    ce[0]=0;
    ce[1]=1e9;
    cnt=1;
    for(int i=1;i<=N;i++){
        cin>>a[i];
        int l=0;
        int r=cnt;
        while(l+5<r){
            int mid=(l+r)/2;
            if(a[i]>=ce[mid])l=mid;
            else r=mid;
        }
        int j=l;
        for(;j<=r;j++){
            if(ce[j]>=a[i])break;
        }
        while(ce[j]==a[i])a[i]++,j++;
        int yuanj=j;
        for(j=cnt+1;j>yuanj;j--)ce[j]=ce[j-1];
        ce[yuanj]=a[i];
        cnt++;
    }
    for(int i=1;i<=N;i++)cout<<a[i]<<" ";
    return 0;
}
  1. 饿饿 饭饭

思路:先将需求从小到大排序,筛出一部分人,再将剩余的人用链表处理,然而还是T了一个点,于是就用了一个小优化使链表处理只经过一次。

代码:

#include<bits/stdc++.h>
using namespace std;
long long n,a[100010],k,b[100010];
int main(){
    cin>>n>>k;
    long long sum=0;
    for(long long i=1;i<=n;i++)cin>>a[i],sum+=a[i],b[i]=a[i];
    if(sum<k){
        cout<<"-1"<<endl;
        return 0;
    }
    sum=0;
    long long js=0;
    long long preid=1;
    sort(a+1,a+n+1);
    for(long long i=1;i<=n-1;i++){
        if(a[i]!=a[i+1]){
            if(js+(n-preid+1)*a[i]>k)break;
            js+=(n-preid+1)*a[i];
            preid=i+1;
            sum=a[i];
        }
    }
    k-=js;
    
//    cout<<"------------------"<<endl;
//    for(long long i=1;i<=n;i++){
//        if(b[i]<=sum)continue;
//        else cout<<b[i]-sum<<" ";
//    }
//    cout<<endl;
//    for(long long i=1;i<=n;i++){
//        if(b[i]<=sum)continue;
//        else cout<<i<<" ";
//    }
//    cout<<endl<<k<<endl;
//    cout<<"-------------------"<<endl;
    long long pre[100001];
    long long to[100001];
    long long wei=0;
    long long cnt=0;
    for(long long i=1;i<=n;i++){
        if(b[i]>sum)b[i]-=sum,to[wei]=i,pre[i]=wei,wei=i,cnt++;
    }
    //cout<<"cnt="<<cnt<<endl;
    to[wei]=100000;
    pre[100000]=wei;
    while(1){
        wei=0;
        if(k==0)break;
        while(to[wei]!=100000){
            wei=to[wei];
            b[wei]--;
            //cout<<"wei:"<<wei<<"  b[wei]="<<b[wei]<<endl;
            if(b[wei]==0){
                to[pre[wei]]=to[wei];
                pre[to[wei]]=pre[wei];
                cnt--;
            }
            k--;
            if(k==0)break;
        }
        if(k==0)break;
    }
    wei=to[wei];
    while(cnt){
        cout<<wei<<" ";
        wei=to[wei];
        if(wei==100000)wei=to[0];
        cnt--;
    }
    return 0;
} 
  1. 任务分配。

思路:简单的dp,但是牵涉到很重要的dp的思路,后续对前面无影响

代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int dp[1000010];
struct EVA{
    int s,e,val;
}cjc[10000];
bool cmp(EVA a,EVA b){
    return a.e<b.e;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>cjc[i].s>>cjc[i].e>>cjc[i].val;
    }
    sort(cjc+1,cjc+n+1,cmp);
    int wei=1;
    for(int i=1;i<=cjc[n].e;i++){
        dp[i]=dp[i-1];
        while(i==cjc[wei].e)dp[i]=max(dp[i],dp[cjc[wei].s]+cjc[wei].val),wei++;
    }
    cout<<dp[cjc[n].e];
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值