A 分饼干

题解:三盒饼干,分给两个小朋友,一定有一名小朋友拿到一盒饼干,一名小朋友拿到两盒饼干,因此,可以将分配饼干的情况划分成以下三种情况:

  • 一名小朋友拿了一盒 a 块的饼干,一名小朋友拿了两盒 b,c 块的饼干。此时,两人饼干数量差为 ∣a−(b+c)∣。
  • 一名小朋友拿了一盒 b 块的饼干,一名小朋友拿了两盒 a,c块的饼干。此时,两人饼干数量差为 ∣b−(a+c)∣。
  • 一名小朋友拿了一盒 c 块的饼干,一名小朋友拿了两盒 a,b 块的饼干。此时,两人饼干数量差为 ∣c−(a+b)∣。

我们用一个变量去和饼干数量差打擂台,如果挑战成功,则用两个变量分别记录下两名小朋友拿的饼干数量。最后输出的时候,将多的输出在前,少的输出在后。

方法1:

#include<bits/stdc++.h>
using namespace std;
int a,b,c,maxn=INT_MAX,flag;
int main(){
    cin>>a>>b>>c;
    if(maxn>abs(a+b-c)){
        maxn=abs(a+b-c);
        flag=1;
    }
    if(maxn>abs(a+c-b)){
        maxn=abs(a+c-b);
        flag=2;
    }
    if(maxn>abs(b+c-a)){
        maxn=abs(b+c-a);
        flag=3;
    }
    if(flag==1){
        cout<<max(a+b,c)<<' '<<min(a+b,c);
    }
    if(flag==2){
        cout<<max(a+c,b)<<' '<<min(a+c,b);
    }
    if(flag==3){
        cout<<max(b+c,a)<<' '<<min(b+c,a);
    }
    return 0;
}

方法2

#include<bits/stdc++.h>
using namespace std;
int main() {
    int a,b,c;
    cin>>a>>b>>c;
    //从小到大排序 
    if(a>b){
        swap(a,b);
    }
    if(b>c){
        swap(b,c);
    } 
    if(a>b){
        swap(a,b);
    }
    if(c>a+b){
        cout<<c<<" "<<a+b;
    }else if(b>a+c){
        cout<<b<<" "<<a+c;
    }else{
        cout<<a+b<<" "<<c;
    }
    return 0;
}

B 卡牌

题解:用一个循环枚举每一个卡包,每个卡包用一个变量记录能买下的最贵的卡牌,使用第二个循环读入卡牌的面额,按题意模拟即可。

参考代码:

#include<bits/stdc++.h>
using namespace std;
int x,n,a[6],ans[6];
int main(){
    cin>>x>>n;
    for(int i=1;i<=n;i++){
        int maxn=0;
        for(int j=1;j<=5;j++){
            cin>>a[j];
            if(x>=a[j]){
                maxn=max(a[j],maxn);
            }
        }  
        ans[maxn]++;
        x-=maxn; 
    }
    for(int i=1;i<=5;i++){
        cout<<ans[i]<<' ';
    }cout<<endl<<x;
    return 0;
}

C 科学计数法

题解:由科学计数法的表达式可知,第一个字符先输出,再判断其长度是否为1来决定是否需要输出小数点,再打标记来统计输入的字符串的小数点之前的个数(第一个除外),同时输出非小数点字符,最后再打印乘10的个数次方。

参考代码:

#include <bits/stdc++.h>
using namespace std;
string s;
int cnt,flag;
int main (){
    cin>>s;
    cout<<s[0];
    if(s.size()!=1) cout<<'.';
    for (int i=1;i<s.size();i++)
        if(s[i]!='.'){
            cout<<s[i];
            if(!flag) cnt++;
        }
        else flag=1;
    cout<<"*10^"<<cnt;
    return 0;
}

D 计算补码

题解:首先特判,若首位为字符’0‘,则原字符串输出,代码结束;将字符串进行倒序存储在数组中,a[0]存储长度,然后除了a[0]的位置不变,其余按位取反(反码),再给a[1]++(补码)需要考虑进位操作,最后倒序输出。

代码:

#include<bits/stdc++.h>
using namespace std;
string s;
int a[1010]; 
int main(){
    cin>>s;
    for(int i=0;s[i]!='\0';i++){
        a[0]++;    
    }
    if(s[0]=='0'){
        cout<<s;
        return 0;
    }
    for(int i=1,j=a[0]-1;i<=a[0];i++,j--){
        a[i]=s[j]-'0';
    }
    for(int i=1;i<a[0];i++){
        a[i]=1-a[i];
    }    
    a[1]++;
    for(int i=1;i<=a[0];i++){
        if(a[i]>1){
            a[i+1]++;
            a[i]=0;
        }else{
            break;
        }
    }
    for(int i=a[0];i>=1;i--){
        cout<<a[i];
    }    
    return 0;
}
Copyright ©图灵之星 2024,转载需注明出处该文件修订时间: 2024-12-28 23:00:02

results matching ""

    No results matching ""