Wannafly交流赛1

10 篇文章 0 订阅

A.有理数
复习一下C/C++的整除,C++的整除是向零取整,这样的好处有blablabla。。
所以分类讨论一下就好了

#include <bits/stdc++.h>

using namespace std;

int main(){
    int t,p,q;
    cin>>t;
    while(t--){
        cin>>p>>q;
        if (p%q==0){
            cout<<p/q-1<<endl;
            continue;
        }
        if (p>0){
            if (q>0) cout<<p/q<<endl;
            else cout<<p/q-1<<endl;

        }
        else {
            if (q>0) cout<<p/q-1<<endl;
            else cout<<p/q<<endl;       
        }

    }

    return 0;
}

B.硬币
这题应该算作贪心,不过贪了好久才贪出来,还是太菜了。
自己感受出一个性质,50元可以等价为10张5元,10元可以等价为2张5元,所以只用考虑全部都是5元就好了,这样就不用写100多行的贪心模拟了。。

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main(){
    ll t,a,b,c,d,v,times,num;
    cin>>t;
    while(t--){
        cin>>a>>b>>c>>d>>v;
        b+=c*2+d*10;
        if (v%5==0){
            cout<<a<<endl;
            continue;
        } 
        num=v/5+1;;
        times=b/num;
        a+=times*(num*5-v);
        cout<<a<<endl;
    }

    return 0;
}

D.迷宫2
这题,应该可以出的,算法完全正确,但是给卡常了,然后自己又不是很肯定时间复杂度,以为是算法错了,导致。。
Bfs+Dijkstra,这题等价于找一条从左下角到右上角的路并要求权值最小,不能动态规划,只能用Dijkstra
这里郑重给出时间复杂度

O(qnmlog(nm)) O ( q n m l o g ( n m ) )

#include <bits/stdc++.h>
#define FOR(i,a,b)  for(int i=(a);i<(b);i++)
#define REP(i,a,b)  for(int i=(a);i<=(b);i++)
#define DOWN(i,a,b) for(int i=(a);i>=(b);i--)
#define CLR(a)      memset(a,0,sizeof(a));

using namespace std;

typedef long long ll;

const int INF=0x3f3f3f3f;
const ll LL_INF=0x3f3f3f3f3f3f3f3f;
const int N=500+10;

int q,n,m;
int vis[N][N];
int dx[4]={0,0,-1,1},
    dy[4]={-1,1,0,0};
ll ans;

struct state{
    int x,y;
    ll dist;
    bool operator< (const state& rhs) const{
        return dist>rhs.dist;
    }
};

int main(){

    scanf("%d%d%d",&q,&n,&m);
    while(q--){
        ll d[N][N],a[N][N];

        priority_queue<state> Q;
        REP(i,1,n) REP(j,1,m) {
            scanf("%lld",&a[i][j]);
            if (a[i][j]==-1) a[i][j]=0;
            else if (a[i][j]==0) a[i][j]=-1;
            d[i][j]=LL_INF;
        }
        REP(i,1,n) {
            if (a[i][1]==-1) continue;
            Q.push((state){i,1,a[i][1]});
            d[i][1]=a[i][1];
        }

        REP(i,1,m){
            if (a[n][i]==-1) continue;
            Q.push((state){n,i,a[n][i]});
            d[n][i]=a[n][i];
        }

        // REP(i,1,n){
        //  REP(j,1,m) cout<<a[i][j]<<' ';
        //  cout<<endl;
        // }
        // REP(i,1,n){
        //  REP(j,1,m) cout<<d[i][j]<<' ';
        //  cout<<endl;
        // }
        ans=-1;
        while(!Q.empty()){
            state t=Q.top();Q.pop();
            // cout<<t.x<<' '<<t.y<<' '<<t.dist<<endl;

            if (t.x==1||t.y==m) {
                ans=t.dist;
                break;
            }
            FOR(i,0,4){

                int x=t.x+dx[i];
                int y=t.y+dy[i];
                ll D=d[t.x][t.y]+a[x][y];

                if (a[x][y]==-1) continue;
                if (x<1||x>n||y<1||y>m) continue;
                if (D>=d[x][y]) continue;//注意,>就会TLE,>=就可以。。


                d[x][y]=D;
                Q.push((state){x,y,D});
            }
        }
        /*REP(i,1,n){
            REP(j,1,m) cout<<d[i][j]<<' ';
            cout<<endl;
        }*/
        printf("%lld\n",ans);
    }



    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值