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; }
作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号