洛谷刷题部分代码存档
我刚刚发现做过的题再找源代码有一点麻烦,遂决定以博客的形式保存。以方便引用、更新。
- 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;
}
- 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;
}
- 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;
}
- 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
- 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;
}
- 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;
}
- 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
- 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;
}
- 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;
}
- 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
- 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;
}
- 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
- 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;
}