YACS-202109

YACS-202109

做烧饼

http://iai.sh.cn/problem/484

#include<bits/stdc++.h>
using namespace std;

int n,k;
int main(){
    cin>>n>>k;
    if(n<k)//如果n<2*k 则需要先烤一面,再烤另外一 
        cout<<2;
    else{
        cout<<ceil(2*n*1.0/k);
    }
     
}

 

正规数的判定

http://iai.sh.cn/problem/485

#include<bits/stdc++.h>
using namespace std;

long long n,k;
bool isPrime(long long n){
    bool flag=true;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            flag=false;
            break;
        }
    }
    return flag;
}

int main(){
    cin>>n;
    int prim=2;
    while(n>0 && prim<n){//质数必须在n的范围内 
        if(prim>5){//超出5 是不规则数 
            cout<<"Irregular Number";
            return 0;
        }
        if(!isPrime(prim)){//不是质数 加1 继续找下一个质数 
            prim++;
            continue;
        }
            
        if(n%prim==0){//是质数的倍数 分解出去此质数 
            n/=prim;
        }else{//不是此质数倍数,prim++找下一个质数 
            prim++;
        }
    }
    cout<<"Regular Number";//没找到不规则数,则是规则数 
    return 0;
}

 

股票市场

http://iai.sh.cn/problem/486

#include<bits/stdc++.h>
using namespace std;
int n,m,stockCnt;//stockCnt买的股票数量 
int a[100005];
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<n-1;i++){
        if(a[i]<=a[i+1]){//
            stockCnt = stockCnt + m/a[i];//买股票数  
            m=m%a[i];//剩余钱
        }else if(a[i]>a[i+1]){//
            m+=stockCnt*a[i];
            stockCnt=0; 
        }
    }
    if(stockCnt>0){//有股票 说明最后一个比前一个大 
        m+=stockCnt*a[n-1];
    }
    cout<<m;
}

 

最年长的人

http://iai.sh.cn/problem/487

//scanf("%d/%d/%d"
#include<bits/stdc++.h>
using namespace std;

struct ymd{
    int year;
    int month;
    int day;
};

bool cmp(ymd ymd1,ymd ymd2){
    if(ymd1.year!=ymd2.year){
        return ymd1.year<ymd2.year;
    }
    if(ymd1.month!=ymd2.month){
        return ymd1.month<ymd2.month;
    }
    return ymd1.day<ymd2.day;
}

int n;
int year,month,day; 
ymd ymds[1000005];
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        scanf("%d-%d-%d",&year,&month,&day);
//        cout<<year<<" "<<month<<" "<<day<<endl;
        ymds[i].year=year;
        ymds[i].month=month;
        ymds[i].day=day;
    }
    sort(ymds,ymds+n,cmp);
    cout<<ymds[0].year<<"-";
    if(ymds[0].month<10){
        cout<<"0"; 
    }
    cout<<ymds[0].month<<"-";
    if(ymds[0].day<10){
        cout<<"0";
    }
    cout<<ymds[0].day;
}

 

分数化小数

http://iai.sh.cn/problem/493

#include<bits/stdc++.h>
using namespace std;

int a,b;
int arr[1000005],idx=0;
int bk[2000005];//桶 记录每次分子对应arr小数后下标 方便循环节输出左括号 
int main(){
    cin>>a>>b;
    bk[a]=idx+1;//bk从1开始,区分是否已经没有放入的 
    int stIndex=0;
    while(a!=b){//无循环节 分子分母相等即分数为1时 转二进制结束 退出循环 
        a=a*2;
        if(a>=b){
            arr[++idx]=1;
            if(a!=b)//a==b 的话 通过while循环退出 这里不处理反否则会出现死循环 
                a-=b;
        }else{
            arr[++idx]=0;
        }
        
        if(bk[a]>0){//出现重复 有循环节 退出循环 (分子*2对应的数只出现一次)
            stIndex=bk[a];//记录开始位置 
            break;
        }else{
            bk[a]=idx+1;
        }
    }
    cout<<"0.";
    // 存放小数后的二进制数字从1开始 第一个整数部分为0 
    for(int i=1;i<=idx;i++){
        if(stIndex==i){// bk下标对应值 从1开始 小数部分从1开始 判断左括号位置 
            cout<<"(";
        }
        cout<<arr[i];
    }
    if(stIndex>0){
        cout<<")";
    }
}
// 1/2=0.1 1/4=0.01
// 1/3=0.(01) 1/5=0.(0011) 1/6=0.0(01)

 

posted @ 2021-10-06 15:45  new-code  阅读(116)  评论(0)    收藏  举报