洛谷刷题部分代码(C语言)

洛谷刷题部分代码存档

我刚刚发现做过的题再找源代码有一点麻烦,遂决定以博客的形式保存。以方便引用、更新。

  1. P1055 [NOIP2008 普及组] ISBN 号码
#include<stdio.h>

int main()
{
    char a[13];
    scanf("%s", a);
    int m, n, i;

    m = (a[0]-'0')*1 + (a[2]-'0')*2 + (a[3]-'0')*3 + (a[4]-'0')*4 + (a[6]-'0')*5 + (a[7]-'0')*6 + (a[8]-'0')*7 + (a[9]-'0')*8 + (a[10]-'0')*9;
    n = m % 11;

    if(n==(a[12]-'0') || n==(a[12]-'X'+10))
        printf("Right");
    else{
        if(n<10){
            a[12] = n + '0';
        }
        else if(n=10){
            a[12] = 'X';
        }
        for(i=0; i<13; i++)
                printf("%c", a[i]);
    }

	return 0;
}
  1. P5705 【深基2.例7】数字反转
#include<stdio.h>

int main()
{
    char n[5];
    int i, j;

    for(i=0; i<5; i++)
        n[i] = getchar();

    for(j=4; j>=0; j--)
        putchar(n[j]);

	return 0;

}
  1. P6685 可持久化动态仙人掌的直径问题
#include<stdio.h>
#include<math.h>
int main()
{
    double n, m;
    scanf("%lf %lf", &n, &m);
    int x;

    x = (int) pow(n, 1.0/m);

    printf("%d", x);

	return 0;
}
  1. P1085 [NOIP2004 普及组] 不高兴的津津
#include<stdio.h>

int main()
{
    int a[7][2], b[7];
    int i, flag = 0, max, n;

    for(i=0; i<7; i++){
        scanf("%d %d", &a[i][0], &a[i][1]);
        b[i] = a[i][0] + a[i][1];
    }
    for(i=0; i<7; i++)
        if(b[i]>8)
            flag = 1;

    if(!flag)
        printf("0");
    else{
        max = b[0];
        for(i=1; i<7; i++){
            if(b[i]>max){
                max = b[i];
                n = i + 1;
            }
        }
        printf("%d", n);
    }

	return 0;
}

2021.1.17


  1. P1980 [NOIP2013 普及组] 计数问题
#include<stdio.h>

int main()
{
    long long n, i, j, count = 0;
    int x;
    scanf("%lld %d", &n, &x);

    for(i=1; i<=n; i++){
        j = i;
        while(j>0){
            if(j%10==x){
                count++;
            }
            j /= 10;
        }
    }
    printf("%lld", count);

	return 0;
}
  1. P1059 [NOIP2006 普及组] 明明的随机数
//桶排序?
#include<stdio.h>
int sort(int a[], int n);
int main()
{
	int n, i, num;
	scanf("%d", &n);
	int a[n];
	for(i=0; i<n; i++){
        scanf("%d", &a[i]);
	}
	num = sort(a, n);
	printf("%d\n", num);
	for(i=0; i<num; i++){
        printf("%d ", a[i]);
	}
	return 0;
}
int sort(int a[], int n)
{
    int i, j, temp;
    //排序
    for(i=0; i<n-1; i++){
        for(j=i+1; j<n; j++){
            if(a[i]>a[j]){
                temp = a[j];
                a[j] = a[i];
                a[i] = temp;
            }
        }
    }
    //去重
    for(i=0; i<n-1; i++){
        for(j=i+1; j<n; j++){
            if(a[i]!=0 && a[j]==a[i]){
                a[j] = 0;
            }
        }
    }
    //计数
    int count = 0;
    for(i=0; i<n; i++){
        if(a[i]!=0){
            count++;
        }
    }
    //移位
    i = 0;
    j = 0;
    while(j<count){
        if(a[i]==0)
            ;
        else{
            a[j++] = a[i];
        }
        i++;
    }

    return count;
}
  1. P5723 【深基4.例13】质数口袋
#include <stdio.h>
int isPrime(int x);
int main()
{
    long n, sum = 0;
    scanf("%ld", &n);

    int i = 2, count = 0;
    while(sum+i<=n){
        if(isPrime(i)){
            printf("%d\n", i);
            sum += i;
            count++;
        }
        i++;
    }
    printf("%d", count);

    return 0;
}
int isPrime(int x)
{
    int j, flag = 0;
    for(j=2 ;j<=x/2; j++){
        if(x%j==0)
            flag = 1;
    }
    if(flag)
        return 0;
    else
        return 1;
}

2021.1.25


  1. P4414 [COCI2006-2007#2] ABC
#include <stdio.h>
#define MIN(p, q) (p < q ? p : q)
#define MAX(p, q) (p > q ? p : q)
int main()
{
    int a, b, c;
    char m[4];
    scanf("%d %d %d", &a, &b, &c);
    scanf("%s", m);

    int min, max, mid;
    min = MIN(MIN(a, b), c);
    max = MAX(MAX(a, b), c);
    mid = a + b + c - min - max;

    if(m[0]<m[1] && m[1]<m[2]){
        printf("%d %d %d", min, mid, max);
    }
    else if(m[0]>m[1] && m[1]>m[2]){
        printf("%d %d %d", max, mid, min);
    }
    else if(m[0]>m[1] && m[0]>m[2] && m[1]<m[2]){
        printf("%d %d %d", max, min, mid);
    }
    else if(m[0]<m[1] && m[0]<m[2] && m[1]>m[2]){
        printf("%d %d %d", min, max, mid);
    }
    else if(m[1]>m[0] && m[1]>m[2] && m[0]>m[2]){
        printf("%d %d %d", mid, max, min);
    }
    else if(m[1]<m[0] && m[1]<m[2] && m[0]<m[2]){
        printf("%d %d %d", mid, min, max);
    }

    return 0;
}
  1. P1089 [NOIP2004 提高组] 津津的储蓄计划
#include <stdio.h>
int main()
{
    int m[12];
    int i, flag;
    int sum = 0;
    float total = 0;
    for(i=0; i<12; i++){
        scanf("%d", &m[i]);
    }

    for(i=0; i<12; i++){
        sum += 300;
        sum -= m[i];
        if(sum<0){
            printf("-%d", i+1);
            return 0;
        }
        else{
           flag = sum / 100;
           total +=  flag * 100;
           sum -= flag * 100;
        }
    }
    total = total * 1.2 + sum;
    printf("%.0f", total);

    return 0;
} 
  1. P1093 [NOIP2007 普及组] 奖学金
#include <stdio.h>

struct stu_info{
    int num;
    int chi;
    int math;
    int eng;
    int total;
};

void sort(struct stu_info *p, int n)
{
    struct stu_info *i, *j;
    struct stu_info temp;//结构体可以整个交换,可以不使用指针

    for(i=p; i<p+n-1; i++){
        for(j=i+1; j<p+n; j++){
            if(i->total < j->total){
                temp = *i;
                *i = *j;
                *j = temp;
            }
            else if(i->total == j->total){
                if(i->chi < j->chi){
                    temp = *i;
                    *i = *j;
                    *j = temp;
                }
                else if(i->chi == j->chi){
                    if(i->num > j->num){
                        temp = *i;
                        *i = *j;
                        *j = temp;
                    }
                }
            }
        }
    }
}

int main()
{
    int n;
    scanf("%d", &n);

    struct stu_info a[n], *p;
    p = a;
    int i;
    for(i=0; i<n; i++){
        scanf("%d %d %d", &p->chi, &p->math, &p->eng);
        p->num = i + 1;
        p->total = p->chi + p-> math + p->eng;
        p++;
    }

    sort(a, n);

    for(p=a; p<a+5; p++){
        printf("%d %d\n", p->num, p->total);
    }

    return 0;
}

注:以下的一块是此题洛谷上的大佬的代码,非博主原创

#include<iostream>
#include<algorithm>
using namespace std;
struct stu
{
    int num;//编号
    int c,m,e; 
    int sum;
}student[310];
bool cmp(stu a,stu b)
{
    if(a.sum>b.sum) return 1;
    else if(a.sum<b.sum) return 0;
    else
    {
        if(a.c>b.c) return 1;
        else if(a.c<b.c) return 0;
        else
        {
            if(a.num>b.num) return 0;
            else return 1;
        }
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        student[i].num=i;//录入编号
        cin>>student[i].c>>student[i].m>>student[i].e;//输入
        student[i].sum=student[i].c+student[i].m+student[i].e;//计算总分
    }
    sort(student+1,student+1+n,cmp);
    for(int i=1;i<=5;i++)
        cout<<student[i].num<<' '<<student[i].sum<<endl;
    return 0;
}

2021.2.3


  1. P1478 陶陶摘苹果(升级版)
#include <stdio.h>
int main()
{
    int n, s, a, b, num = 0;
    scanf("%d %d\n%d %d", &n, &s, &a, &b);

    int i, j, temp1, temp2, m[n][2];
    for(i=0; i<n; i++){
        scanf("%d %d", &m[i][0], &m[i][1]);
    }

    for(i=0; i<n-1; i++){
        for(j=i+1; j<n; j++){
            if(m[i][1]>m[j][1]){
                temp1 = m[i][1];
                m[i][1] = m[j][1];
                m[j][1] = temp1;
                temp2 = m[i][0];
                m[i][0] = m[j][0];
                m[j][0] = temp2;
            }
        }
    }
    for(i=0; i<n; i++){
        if(m[i][0]<=a+b){
            s -= m[i][1];
            if(s>=0){
                num++;
            }
        }
    }

    if(num>n){
        num = n;
    }

    printf("%d", num);

    return 0;
}
  1. P2615 [NOIP2015 提高组] 神奇的幻方
//暴力解法,从39开始超时,不行
#include <stdio.h>
int main()
{
    int n;//n为奇数且n<=39
    scanf("%d", &n);
    int a[n][n], mid = (n - 1) / 2;
    //方阵全部初始化为0
    int i, j;//i: 行  j:列
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            a[i][j] = 0;
        }
    }
    int k = 1, num = 0;
    //将1写在第一行中间
    i = 0;
    j = mid;
    a[i][j] = k++;
    //开始
    while(num<n*n){
        if(i==0 && j!=n-1){
            i = n - 1;
            j++;
            if(a[i][j]==0){
                a[i][j] = k++;
            }
        }
        else if(j==n-1 && i!=0){
            j = 0;
            i--;
            if(a[i][j]==0){
                a[i][j] = k++;
            }
        }
        else if(i==0 && j==n-1){
            i++;
            if(a[i][j]==0){
                a[i][j] = k++;
            }
        }
        else if(i!=0 && j!=n-1){
            i--;
            j++;
            if(a[i][j]==0){
                a[i][j] = k++;
            }
            else{
                j--;
                i += 2;
                a[i][j] = k++;
            }
        }
        num++;
    }
    for(i=0; i<n; i++){
        for(j=0; j<n; j++){
            printf("%d ", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

2021.2.24


  1. P1015 [NOIP1999 普及组] 回文数
#include <stdio.h>
#include <string.h>
#define N 200
int a[200];
int isHw(int ws)
{
    int i;
    for(i=0; i<ws; i++){
        if(a[i]!=a[ws-1-i]){
            return 0;
        }
    }
    return 1;
}
int add(int ws, int n)
{
    int b[200], jw = 0, he = 0;
    int i;
    for(i=0; i<ws; i++){
        b[ws-1-i] = a[i];
    }
    for(i=0; i<ws; i++){
        he = a[i] + b[i] + jw;
        a[i] = he % n;
        jw = he / n;
        if(i==ws-1 && jw>0){
            ws++;
            i += 2;
            a[ws-1] = jw;
        }
    }
    return ws;
}
int main()
{
    int n, ws;
    char num[N];

    scanf("%d %s", &n, num);
    ws = strlen(num);
    extern int a[200];
    int b[200], i;
    for(i=0; i<ws; i++){
        if(num[i]<='9' && num[i]>='0'){
            a[i] = num[i] - '0';
        }
        else if(num[i]<='z' && num[i]>='a'){
            a[i] = num[i] - 'a' + 10;
        }
        else{
            a[i] = num[i] - 'A' + 10;
        }
    }
    int pd, ans = 0, nws;
    while((pd=isHw(ws)) != 1){
        ans++;
        if(ans>30){
            break;
        }
        else{
            nws = add(ws, n);
        }
        ws = nws;
    }
    if(ans>30){
        printf("Impossible!");
    }
    else{
        printf("STEP=%d", ans);
    }

    return 0;

}
  • 2
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值