题解

A 签到

#include "stdio.h"
int main()
{
    printf("zhe\n");
    printf("shi\n");
    printf("yi\n");
    printf("dao\n");
    printf("qian\n");
    printf("dao\n");
    printf("ti\n");
    return 0;
}

B 签到2

alt

#include "stdio.h"
#include"math.h"
int main()
{
    int x1,y1,r1,x2,y2,r2;
    float P;
    int T;
    scanf("%d",&T);
    while(T--)
    {
    	scanf("%d%d%d%d%d%d",&x1,&y1,&r1,&x2,&y2,&r2);
    	P=sqrt(pow((x1-x2),2)+pow((y1-y2),2));
    	if(abs(r1-r2)<=P&&P<=r1+r2)//
    	printf("YES\n");
    	else
    	printf("NO\n");
    	}

    return 0;
}

c

多举几个例子就能推出来 答案只与x二进制数有几个1和x是否为奇数有关。

  • 奇数个1且x为奇的公式是2*1的个数-1 例如19的二进制=10011=5
  • 奇数个1且x为奇的公式是2*1的个数+1
  • 偶数运行一次便华为了奇数形式
#include"bits/stdc++.h"
using namespace std;
void slove(){
    ll x;
    scanf("%ld",&x);
    ll ans=0;
    for(int i=0;i<=100;i++){
        if(x<(1<<i))break;
        if(x&(1<<i)){
            ans++;
        }
    }
    if(ans%2){
        printf("%ld\n",2*ans+1-((x&1)?2:0));
    }
    else {
        //cout<<2*(ans-1)+2-((x&1)?2:0)<<endl;
        printf("%ld\n",2*(ans-1)+2-((x&1)?2:0));
    }
}

int main(){
    //js;
    int t=1;
    scanf("%d",&t);
    while(t--)slove();
}

D

考点:思维+进制转换

思路:因为k次方要么不用,要么只能用一次,那么就将每个数都转换为k进制,并且每一位只能用一次,超过一次的就输出no

这题出的太酷了!!! 代码部分:

int cnt[109];
void slove() {
    int n, k;
    cin >> n >> k;
    ll x;
    int f = 0;
    memset(cnt, 0, sizeof cnt);
    for(int i=1;i<=n;i++){
        cin >> x;
        int p = 0;
        while (x > 0&&f==0) {
            int y = x % k;
            x = x / k;
            if (y > 1) { f = 1; break; }//只能用一次,y不能大于1
            if (y && cnt[p]) {//已经用过一次了,不能再用了。
                f = 1;
                break;
            }
            if (y && cnt[p]) {
                f = 1;
                break;
            }
            if (y)cnt[p] = 2;
            p++;
        }
    }
    if (f) {
        cout << "NO" << endl;
    }
    else {
        cout << "YES" << endl;
    }
}

int main() {
    js;
    int t = 1;
    cin>>t;
    while (t--)slove();
}

E

数组

#include <stdio.h>
int main()
{
        int n,m,k;
        scanf("%d %d %d",&n,&k,&m);
        int a[100];
        int i,temp;
        int count=0;
        temp=n;
        for(i=0;i<n;i++)
        {
          a[i]=i;//记录位置
        }
        
        while(n>1)
        {
             if(a[k]!=-1)   
             {
                 count++;报数
             }
             if(count==m)
             {
                    a[k]=-1;//出列  
                    count=0;
                    n--;  
             }
             k++;
             if(k==temp)
             {
                    k=0;
             }
        }
        for(i=0;i<temp;i++)
        {
                if(a[i]!=-1)  
                {
                        printf("%d",a[i]);
                }
        }
        return 0;
}

f

模拟

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
int x,y,k;
int main(void)
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,a,b,d;
        int ans=(int)1e9;
        cin>>n>>a>>b;
        for(int i=1;i<=n;i++)
        {
            cin>>d>>x>>y;
            //cout<<"d: "<<d<<" x: "<<x<<" y: "<<y<<endl;
            for(int j=1;j<=d;j++)
            {
                cin>>k;
                int num=k;
                //cout<<"k: "<<k<<" ";
                if(num>=x)//大于商家卷--
                    k-=y;
                if(num>=a)//大于自己的卷--
                    k-=b;
                //cout<<" after: "<<k<<endl;
                ans=min(ans,k);//更新答案
                ans=max(0,ans);//保证不为0,商家已经免费请你吃了,总不能还给钱给你吧QAQ
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

全部评论
E题还能用stl中的队列写 #include<iostream> #include<string> #include<cstring> #include<vector> #include<map> #include<set> #include<queue> #include<cmath> #include<cstdio> #include<algorithm> #define int long long using namespace std; queue<int> q; void solve() {     int n, k, m, cnt = 1;     cin >> n >> k >> m;     for(int i = k; i < n; i++) q.push(i);     for(int i = 0; i < k; i++) q.push(i);     while(q.size() > 1){         if(cnt == m){             q.pop();             cnt = 1;         }         else{             cnt++;             q.push(q.front());             q.pop();         }     }     cout << q.front(); } signed main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int t = 1; //cin >> t; while(t--){ solve(); } return 0; }
点赞 回复 分享
发布于 2023-11-02 22:07 湖南
E题提供第二种思路 #include<iostream> using namespace std; int solve(int n,int m,int k) {     int ans=0;     for(int i=2;i<=n;i++)     {         ans=(ans+m)%i;     }     cout<<(ans+k)%n;     return 0; } int main(void) {     int n,k,m;     int num;     cin>>n>>k>>m;     solve(n,m,k);     return 0; }
点赞 回复 分享
发布于 2023-10-28 23:21 湖南

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务