牛客周赛round51

A

没得说

#include <iostream>
#include <map>
#include <queue>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstring>
using namespace std;
using ll = long long;
ll P = 998244353;
const int N = 2e5 + 100;
ll a[N];
ll vis[N];
ll lis[N];
void solve() {
    ll m;cin>>m;
    cout<<(m+1)/2;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    /*cin >> t;*/
    while (t--) {
        solve();
    }
    return 0;
}

B

也没得说

#include <iostream>
#include <map>
#include <queue>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstring>
using namespace std;
using ll = long long;
ll P = 998244353;
const int N = 2e5 + 100;
ll a[N];
ll vis[N];
ll lis[N];
string s[110];
void solve() {
    int n;cin>>n;
    ll ans=0;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        for(int j=0;j<s[i].size();j++)
        {
            ans+=s[i][j]-'0';
        }
    }
    if(ans%3==0)cout<<"YES";
    else cout<<"NO";
    
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    /*cin >> t;*/
    while (t--) {
        solve();
    }
    return 0;
}

C

注意分情况讨论

#include <iostream>
#include <map>
#include <queue>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstring>
#include <iomanip>
using namespace std;
using ll = long long;
ll P = 998244353;
const int N = 2e5 + 100;
ll a[N];
ll vis[N];
ll lis[N];
void solve() {
    double x,y,t,a,b,c;cin>>x>>y>>t>>a>>b>>c;
    if(x<=t)
    {
        double time=(100-x)/c;
        cout << fixed << setprecision(9) << time << endl;
    }
    else {
        double time=(100-x)/b;
        double cnt=(x-t)/y+(100-t)/c;
        time=min(time,cnt);
        cout << fixed << setprecision(9) << time << endl;
    }
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int q = 1;
    /*cin >> t;*/
    while (q--) {
        solve();
    }
    return 0;
}

D

辗转相除

#include<bits/stdc++.h>
#define x first   
#define y second 
using namespace std;
typedef long long ll;
typedef double D;
typedef pair<int, int> Pii;
const int N = 2e5 + 10;
ll gcd(ll a,ll b){
  return b==0?a:gcd(b,a%b);
}
ll f(string a,ll b){
  ll res=0;
  for(char ch:a){
    res=(res*10%b+(ch-'0'))%b;
  }
  return res;
}
void solved()
{
      string a;
      ll b;
      cin>>a>>b;
      ll a_mod_b=f(a,b);
      cout<<gcd(b,a_mod_b)<<"\n";

}
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t=1;

  while (t--)
  {
  solved();
  }
  return 0;
}

E

先来个错误示范175分

#include <iostream>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;

const int INF = 1e9 + 7;
const int MAXN = 510;
int a[MAXN][MAXN];
int lis[MAXN][MAXN];
bool vis[MAXN][MAXN];
int dxx[4] = { 1, -1, 0, 0 };
int dyy[4] = { 0, 0, -1, 1 };

struct Point {
    int x, y;
};

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n;
    cin >> n;
    
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cin >> a[i][j];
    
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j <= n; j++) {
            lis[i][j] = INF;
            vis[i][j] = false;
        }
    }
    
    queue<Point> q;
    q.push({1, 1});
    lis[1][1] = a[1][1];
    
    while (!q.empty()) {
        Point p = q.front();
        q.pop();
        
        if (vis[p.x][p.y]) continue;
        vis[p.x][p.y] = true;
        
        for (int i = 0; i < 4; i++) {
            int nx = p.x + dxx[i];
            int ny = p.y + dyy[i];
            if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && !vis[nx][ny]) {
                lis[nx][ny] = min(lis[nx][ny], max(lis[p.x][p.y], a[nx][ny]));
                q.push({nx, ny});
            }
        }
    }
    
    cout << lis[n][n] << endl;
    return 0;
}

这种就是不会走被标记的点,就漏情况了,正确做法是二分加BFS

正确代码稍后给出

#include <iostream>
#include <map>
#include <queue>
#include <algorithm>
#include <vector>
#include <cmath>
#include <cstring>
using namespace std;
using ll = long long;
ll P = 998244353;
const int N = 2e5 + 100;
ll a[1000][1000];
ll vis[1000][1000];
ll lis[1000][1000];
int dxx[4] = { 1,-1,0,0 };
int dyy[4] = { 0,0,-1,1 };
struct point {
    int dx;
    int dy;
};
bool check(ll n,ll mid)
{
    
    if(a[1][1]>mid)return false;
     memset(vis,0,sizeof(vis));
    queue<point>que;
    vis[1][1]=1;
    que.push({1,1});
    while(!que.empty())
    {
        if(que.front().dx==n&&que.front().dy==n)
            return true;
        for(int k=0;k<=3;k++)
        {
            int ddxx=que.front().dx+dxx[k];
            int ddyy=que.front().dy+dyy[k];
            if(vis[ddxx][ddyy]||ddxx<1||ddyy<1||ddxx>n||ddyy>n||a[ddxx][ddyy]>mid)continue;
            que.push({ddxx,ddyy});
            vis[ddxx][ddyy]=1;
        }
        que.pop();
    }
    return false;
}
void solve() {
    int n; cin >> n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)cin>>a[i][j];
    ll l=0;
    ll r=1e9+1;
    while(l<r)
    {
        ll mid=(l+r)>>1;
        if(check(n,mid))
        {
            r=mid;
        }
        else l=mid+1;
    }
    cout << l;
}

int main() {
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int t = 1;
    /*cin >> t;*/
    while (t--) {
        solve();
    }
    return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值