YACS-202107

布置会场

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

 

#include<bits/stdc++.h>
using namespace std;
//定义花束数量、三种费用、费用和变量 
int x,y,a,b,c,ans;
int main(){
    cin>>x>>y;
    cin>>a>>b>>c;
    if(a+b>=2*c){//双拼花束划算 优先使用双拼
        if(x>y){//需要百合多
            int temp=a;
            if(2*c<a){//如果双拼1份百合+一份郁金香比单独买百合还便宜,使用双拼买 
                temp=2*c;
            }
            ans += y*c*2+(x-y)*temp;//总费用为双拼+百合费用
        }else{//需要郁金香多 
            int temp=b;
            if(2*c<b){//如果双拼1份百合+一份郁金香比单独买郁金香还便宜,使用双拼买
                temp=2*c;
            }
            ans += x*c*2+(y-x)*temp;//总费用为双拼+郁金香费用
        }
    }else{//双拼不划算 
        ans+=a*x+b*y;//百合费用+郁金香费用
    }
    cout<<ans;
}
//251 439
//329 242 111
//97458

 

选科组合

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

#include<bits/stdc++.h>
using namespace std;
//定义整形数组 和 成绩和变量 
int a[6],ans;
int main(){
    cin>>a[0]>>a[1]>>a[2]>>a[3]>>a[4]>>a[5];
    sort(a,a+6);//使用c++ 内置函数从小到大排序 
    ans+=a[3]+a[4]+a[5];//累加最大的三个 
    cout<<ans;
}

进制回文

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

#include<bits/stdc++.h>
using namespace std;
//定义数组并把需要转换的进制数放入数组 
int bs[] = {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
//1.十进制转其他进制 2.转换对应进制后判断是否为回文数 
bool isPalindrome(int ten,int hex){
    char ans[1000]={0};
    int ci=0;
    while(ten){
        if(ten%hex>=0){//取余数 
            ans[ci++]=ten%hex-10+'A';//除以对应进制并转换对应字母 
        }else{
            ans[ci++]=ten%hex+'0';//除以对应进制并转换对应字符 
        }
        ten/=hex;//除以对应进制 
    }
    ci--;
    bool isPrime=true;//默认是回文数 
    for(int i=0;i<=ci/2;i++){//比较一半的数据 
    //第一个和倒数第一个比 第二个和倒数第二个比 
        if(ans[i]!=ans[ci-i]){//如果有不相等的则一定不是回文数 
            isPrime=false;
            break;
        }
    }
    return isPrime;
} 
int main() {
    int x;
    cin>>x;
    bool flag=false;
    for(int i=0;i<15;i++){//2-16进制分别比较 
        if(isPalindrome(x,bs[i])){//有一个就符合输出yes 
            flag=true;
            break;
        }
    }
    if(flag){
        cout<<"Yes";
        cout<<endl;
        for(int i=0;i<15;i++){//所有的进制都检查是否为回文数 
            if(isPalindrome(x,bs[i])){//输出所有是回文数的进制 
                cout<<bs[i]<<" ";
            }
        }
    }else{
        cout<<"No";
    }
    return 0;
}

比赛组卷

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

#include<bits/stdc++.h>
using namespace std;
//定义抽取题数n和题库总数k 
int n,k; 
//定义计数排序数组a 方便输出暂存数组b 
int a[100000],b[100000];
//当前输入数temp 累加重复数ans 
int temp,ans;
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++){//组A卷 
        cin>>temp;//输入题号到变量temp
        a[temp]++;//题号做为下标,对应元素值加1 
    }
    
    for(int i=0;i<n;i++){//组B卷
        cin>>temp;//输入题号到变量temp
        a[temp]++;//题号做为下标,对应元素值加1 
    }
    //如果有重复题 题号对应数组元素的值为2 a[temp]++ 两次 
    for(int i=0;i<=k;i++){
        if(a[i]==2){//统计有组卷两次的 
            ans++;
            b[ans]=i;//放入b数组 
        }
    }
    cout<<ans<<endl;
    for(int i=1;i<=ans;i++){
        cout<<b[i]<<" ";
    }
}

消消乐(一)

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

#include<bits/stdc++.h>
using namespace std;
char a[1001][1001];//二维数组存储棋盘对应点
//提前算好,减少重复计算,提高效率(当前炸开点数为前面一个和+1,前面和每次已计算好)
int b[1001][1001][5];//二维数组记录每个点从四个方向可以炸开几个点 
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){//把对应的点分别记录到数组 
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=1;i<=n;i++){//从左右两个方向计算到每个点可以炸开的点数和 
        for(int j=1;j<=m;j++){//从左计算到每个点可炸开的点数和 
            b[i][j][1]=b[i][j-1][1]+1;//默认累加 
            if(a[i][j]=='#'){//遇到障碍物累加清0
                b[i][j][1]=0;
            }
        }
        for(int j=m;j>=1;j--){//从右计算到每个点炸开的点数和 
            b[i][j][2]=b[i][j+1][2]+1;//默认累加
            if(a[i][j]=='#'){//遇到障碍物累加清0
                b[i][j][2]=0;
            }
        }
    }
    for(int j=1;j<=m;j++){//从上下两个方向计算到每个点可以炸开的点数和
        for(int i=1;i<=n;i++){//从上计算到每个点可炸开的点数和 
            b[i][j][3]=b[i-1][j][3]+1;//默认累加
            if(a[i][j]=='#'){//遇到障碍物累加清0
                b[i][j][3]=0;
            }
        }
        for(int i=n;i>=1;i--){//从下计算到每个点可炸开的点数和
            b[i][j][4]=b[i+1][j][4]+1;//默认累加
            if(a[i][j]=='#'){//遇到障碍物累加清0
                b[i][j][4]=0;
            }
        }
    }
    int maxN=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            //如果是.,并且四个方向和并当前大则把这个和赋值给最大值
            //四个方向当前这个点被计算了4次,所以需要减3 
            int sum= b[i][j][1]+b[i][j][2]+b[i][j][3]+b[i][j][4]-3;
            if(a[i][j]=='.'&&sum>maxN){
                maxN=sum;
            }
        }
    }
    cout<<maxN;
}
posted @ 2021-07-25 18:40  new-code  阅读(93)  评论(0)    收藏  举报