第六届算法大赛(初级组)

赚钱

赚钱

题目的意思是让我们根据小明的上班时间和下班时间来求得小明的年薪。
题目说的年薪都是按闰年计算,闰年有366天。
年薪 = 366 * 日薪
日薪 = k * t 其中k为小明每秒得到的钱,t为小明每天工作的时间(单位为秒)
现在需要计算的就是小明每天工作的时间。为了方便计算我们可以把小明的上班时间和下班时间全部都转化为距离一天的开始(0:0:0)已经过去了多少秒,将下班的时间减去上班的时间就得到了小明每天工作的时间(单位秒)

代码

#include <stdio.h>

int h1, d1, s1, h2, d2, s2, k;

int main()
{
    scanf("%d%d%d%d%d%d%d", &h1, &d1, &s1, &h2, &d2, &s2, &k);
    int t1 = h1 * 3600 + d1 * 60 + s1; // t1为小明的上班时间转化的秒数
    int t2 = h2 * 3600 + d2 * 60 + s2; // t2为小明的小班时间转化的秒数
    int t = t2 - t1;  // 小明每天的工作时间
    int ans = 366 * k * t;
    printf("%d\n", ans);
    return 0;
}

寻找优美数

寻找优美数

判断一个数 s s s(如 a b c d e abcde abcde)是否为“优美数”的条件为: a b c 、 b c d 、 c d e abc、bcd、cde abcbcdcde是否可以被 k k k整除,那么我们现在最需要得到的就是 a b c 、 b c d 、 c d e abc、bcd、cde abcbcdcde

a b c = s / 100 abc = s / 100 abc=s/100, b c d = s bcd = s %10000/10 bcd=s, c d e = s cde = s cde=s% 1000 1000 1000

判断一个数s是否能被k整除: s s s % k k k == 0,题目求将[10000, 99999]中的所有为"优美数"的都是输出。可以直接从10000到99999循环,对每个数判断是否为"优美数",如果是优美数就输出该数。

代码

#include <stdio.h>

int main()
{
    int k;
    bool st = 0;  // 判断是否存在“优美数”
    scanf("%d", &k);
    for(int i = 10000; i < 100000; i ++)
    {
        int a1 = i / 100, a2 = i % 10000 / 10, a3 = i % 1000;
        if(a1 % k == 0 && a2 % k == 0 && a3 % k == 0) // 判断该数是否为“优美数”
        {
            printf("%d\n", i);	// 如果该数为“优美数”,就将该数输出
            st = 1;	// 同时将st变成1,表示已经存在了“优美数”
        }
    }
    if(!st) printf("NO\n");   // 如果不存在优美数就输出"NO"
    return 0;
}

x的胞兄胞弟到底有多少哇

x的胞兄胞弟到底有多少哇

判断一个数s是否x的胞兄胞弟的条件为: s s s % x x x == 0。

现在我们需要求在一个区间[l, r]内有多少个x的胞兄胞弟,这个可以用一个循环来判断,对从l开始循环到r中的数判断是否满足为x的胞兄胞弟。

代码

#include <stdio.h>

int main()
{
    int t; 
    scanf("%d", &t);
    while(t --)    // 因为题目中有多组数据,所以需要用一个循环来输入和输出
    {
        int l, r, x;
        scanf("%d%d%d", &l, &r, &x);
        if(l > r) // 因为输入的数据不一定是l<r,所以当l>r时,就要将l和r交换 
        {
            int t = r; // t用来存储中间值
            r = l;
            l = t;
        }
        int cnt = 0; // cnt 用来统计x的胞兄胞弟的个数
        for(int i = l; i <= r; i ++)
            if(i % x == 0) // 判断该数是否为“优美数”
                cnt ++;	// 如果当前数是x的胞兄胞弟则cnt加1
       	printf("%d\n", cnt);
    }
    return 0;
}

奇数偶数和

奇数偶数和

  1. 奇数+奇数=偶数
  2. 奇数+偶数=奇数
    所以
  3. 先统计初始状态分别奇数和偶数的和
  4. 然后判断是给奇数加还是给偶数加,以及是加偶数还是加奇数
#include <iostream>
#include <cstring>
#include <algorithm>
//#include <stdio.h>

using namespace std;
const int N = 66;
typedef long long LL;

void solve(){
    int n, q; cin >> n >> q;
    //scanf("%d%d", &n, &q);
    LL cl = 0, cr = 0, sl = 0, sr = 0;
    //依次记录奇数的个数,偶数的个数,奇数和,偶数和
    for (int i = 1; i <= n; i ++ ){ 
        LL x; cin >> x; //scanf("%lld", &x);
        if(x % 2){
            cl ++, sl += x;
        }else{
            cr ++, sr += x;
        }
    }
    while (q -- ){
        LL x, c; cin >> x >> c;
        //scanf("%d%d", &x, &c);
        if(x){ //x=1 给所有奇数加
            if(c % 2){ //奇数
                sl += cl * c; //给cl个奇数+c
                //奇数+奇数=偶数
                sr += sl, sl = 0;
                //奇数累加到偶数上面,奇数清0
                cr += cl, cl = 0;
            }else{ //偶数
            	//奇数+偶数=奇数
                sl += cl * c; 
            }
        }else{ //x=0 给所有偶数加
            if(c % 2){ //+奇数
                sr += cr * c; //给cr个偶数分别+c
                //偶数+奇数=奇数
                sl += sr, sr = 0;
               	//把所有偶数累加到奇数上,偶数清0
                cl += cr, cr = 0;
            }else sr += cr * c;
        }
        cout << sl + sr << endl; //每一轮输出
        //printf("%lld", sl + sr);
    }
}
 
int main(){
    int t; cin >> t; //scanf("%d", &t);
    while (t -- ){
        solve();
    }
    return 0;
}

密码密室

密码密室

  1. 字符串读入需要注意,也可以以字符数组的形式读入

char s[N]; cin >> s; //scanf("%s", s);

  1. 'U’就要-1还原
  2. 'D’就要+1还原
  3. 因为是循环的所以%10就是0~9轮转循环
  4. 需要注意的是-1时可能得到的为负数,所以(a[i] - 1 + 10) % 10;

C++

#include <iostream>
#include <cstring>
#include <algorithm>

//#include <stdio.h>
//#include <string.h>

using namespace std;
const int N = 111;
int a[N];

void solve(){
    int n; cin >> n; //scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) cin >> a[i];
    //scanf("%d", &a[i]);
    for (int i = 0; i < n; i ++ ){
        int x; cin >> x; //scanf("%d", &x);
        string s; cin >> s; //scanf("%s", &s);
        for (int j = 0; j < x; j ++ ){
            if(s[j] == 'U') a[i] = (a[i] - 1 + 10) % 10;
            else a[i] = (a[i] + 1) % 10;
        }
    }
    for (int i = 0; i < n; i ++ ) cout << a[i] << ' ';
    puts(""); //printf("\n");
}

int main(){
    int t; cin >> t; //scanf("%d", &t);
    while (t -- ){
        solve();
    }
    return 0;
}

C

#include <stdio.h>
#include <string.h>

const int N = 111;
int a[N];
char s[N];

void solve(){
    int n; scanf("%d", &n);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    for (int i = 0; i < n; i ++ ){
        int x; scanf("%d", &x);
        scanf("%s", s);
        for (int j = 0; j < x; j ++ ){
            if(s[j] == 'U') a[i] = (a[i] - 1 + 10) % 10;
            else a[i] = (a[i] + 1) % 10;
        }
    }
    for (int i = 0; i < n; i ++ ) printf("%d ", a[i]);
    printf("\n");
}

int main(){
    int t; scanf("%d", &t);
    while (t -- ){
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值