杭电OJ
算法难题
name大权子
我是一个菜逼加小白,请多指教!!!
展开
-
杭电OJ2058
杭电OJ2058我写的超时了 下面是不超时的#include <stdio.h>#include <math.h> int main() { int n, m, i, j; while(scanf("%d%d", &n, &m) != EOF) { if(n==0 && m==0) break; for(j=(int)sqrt((double)(2*m)); j>=1; j--) { i = (原创 2021-02-22 14:35:11 · 197 阅读 · 0 评论 -
杭电OJ2057
杭电OJ2057这题考的是16进制读取,用C++的关键字#include<cstdio>#include<iostream>using namespace std;int main(){ int n,m,sum; while(cin>>hex>>n>>m){ sum = n+m; if(sum<0){ cout<<"-"<<hex<<uppercase<<-sum&l原创 2021-02-22 13:44:11 · 248 阅读 · 0 评论 -
杭电OJ2056
杭电OJ2056这道题看似简单,但挺考验代码能力以及是否考虑周全的。先写一写伪代码:if(两个矩形有相交部分)printf(输出相交部分面积)else printf(0.00\n);将第一个矩形的左下角,右上角坐标分别设为(n1,m1),(n2,m2),同样第二个设个(n3,m3),(n4,m4),由于题目所给的坐标不一定是给出左下角、右下角坐标,因此应事先进行数据处理。下面先解决简单的——没有相交的情况:n1>n4||m1>m4||n2<n3||m2<m3(画个图比划原创 2021-02-22 13:27:17 · 272 阅读 · 0 评论 -
杭电OJ2055
杭电OJ2055这题注意读字符时会读取换行符,所以用getchar()都去掉换行#include<stdio.h>int fx(char x){ if(x>='A'&&x<='Z'){ return x-'A'+1; }else if(x>='a'&&x<='z'){ return -(x-'a'+1); }}int main(){ int T,y; scanf("%d",&T); while(T--)原创 2021-02-21 16:06:27 · 110 阅读 · 0 评论 -
杭电OJ2054
杭电OJ2054不给定限制范围,你可以意想到n种可能性(坑点所在)本题主要校验点,小数点后0的处理,不考虑两个数前面无效0和无效符号的处理增加检验数据55.0000和55987.98和987.9800087和87.01测试结果YESYESNO主要用到字符串处理函数strstr()用于检验目标字符串中第一次出现某个字符或者某段字符的位置strcmp()用于字符串的比较,若字符串相等,则返回0同时字符串数组题目没有声明大小,尽量开到最大,这里开到10000,可以AC#include原创 2021-02-21 15:52:17 · 438 阅读 · 1 评论 -
杭电OJ2053
杭电OJ2053#include<stdio.h>int n ;int main(){ while(scanf("%d",&n)!=EOF){ int count =0; for(int i =1;i<=n;i++){ if(n%i==0){ count++; } } if(count%2==0){ printf("0"); }else{ printf("1"); } printf("\n"); } retur原创 2021-02-21 14:42:02 · 110 阅读 · 0 评论 -
杭电OJ2052
杭电OJ2052#include<stdio.h>int n,m;int main(){ while(scanf("%d %d",&n,&m)!=EOF){ for(int i =0;i<=m+1;i++){ for(int j =0;j<=n+1;j++){ if((j==0&&i==0)||((j==n+1)&&i==(m+1))||((j==n+1)&&i==0)||((j==0)&原创 2021-02-21 14:32:06 · 181 阅读 · 0 评论 -
杭电OJ2051
杭电OJ2051这题是将一个10进制正数转化为二进制数#include<stdio.h>int n;int er[10];int main(){ while(scanf("%d",&n)!=EOF){ int temp = 1; int i=0; while(n!=0){ if(n%2==0){ er[i++] = 0; }else{ er[i++] = 1; } n = n/2; } for(i=i-1;i>原创 2021-02-21 14:15:55 · 215 阅读 · 0 评论 -
杭电OJ2050
杭电OJ2050#include <stdio.h>int main(){ int c,n; while(scanf("%d",&c)!=EOF){ while(c--){ scanf("%d",&n); int sum=2*n*n-n+1; //直接代公式 printf("%d\n",sum); } } return 0;}原创 2021-02-21 13:41:39 · 112 阅读 · 0 评论 -
杭电OJ2049
杭电OJ2049先把找正确新娘的去除,在用2048题的方法计算错的种类数#include<stdio.h>long long pernum[21];int c;int main(){ pernum[1] = 0; pernum[2] = 1; pernum[3] = 2; for(int i = 4;i<=20;i++){ pernum[i] = (i-1)*(pernum[i-1]+pernum[i-2]); } scanf("%d",&c); whi原创 2021-02-21 12:59:53 · 308 阅读 · 0 评论 -
杭电OJ2048
杭电OJ2048不会 排错公式#include<stdio.h>int n;long long pernum[21];int main(){ pernum[1] = 0; pernum[2] = 1; pernum[3] = 2; for(int i = 4;i<=20;i++){ pernum[i] = (i-1)*(pernum[i-1]+pernum[i-2]); } scanf("%d",&n); while(n--){ int numbe原创 2021-02-21 12:39:36 · 362 阅读 · 0 评论 -
杭电OJ2047
杭电OJ2047这个递推思路仔细体会/*方法一: 找第n种情况,考虑用递推(这种解法类似于杭电OJ 2047,从第n种填什么去分析) 第n种情况可以填入的字符串有E,O,F三种情况1.当填E时,前面n-1个填的方法数是a[n-1],2.当填F时,前面n-1个填的方法数是a[n-1],3.当填O时,因为相邻两个不能是O,O,所以第n-1种只能填E,F,因为a[n-1]的第n-1种必须E,O,F都要填入,(关键弄清a[n-1]代表什么意义,不满足就继续往前找a[n-2],直到满足为止) 所原创 2021-02-21 12:10:44 · 231 阅读 · 1 评论 -
杭电OJ2046
杭电OJ2046注意INT类型会越界,用LL类型且注意输出语句的匹配#include<cstdio>int n ;long long num[51];int main(){ num[1] = 1; num[2] = 2; num[3]=3; while(scanf("%d",&n)!=EOF){ for(int i =4;i<=n;i++){ num[i]=num[i-1]+num[i-2]; } printf("%lld\n",num[n])原创 2021-02-21 11:00:16 · 170 阅读 · 0 评论 -
杭电OJ2045
杭电OJ2045递推法 规律比较难找 没做出来 看的别人的思路思路:分两种情况第n-1个元素和第一个元素同色,则第n-2个元素和第一个元素肯定不同色(因为之前的序列都是合法的),那么最后一个元素有两种选法,则这种情况的数量为2*f(n-2)第n-1个元素和第一个元素不同色,则最后一个格子只有一种选法,故这种情况数量为f(n-1)故所有情况为二者之和注意用Long Long 类型 递推容易溢出#include<cstdio>int main(){ int n; w原创 2021-02-07 22:36:19 · 270 阅读 · 0 评论 -
杭电OJ2044
杭电OJ2044递推问题#include<cstdio>int main(){ int n; scanf("%d",&n); while(n--){ int x=0,y=0; long long length[52]; scanf("%d %d",&x,&y); length[x] = 1; length[x+1]=1; length[x+2]=2; for(int i=x+3;i<=y;i++){ length[i]原创 2021-02-07 21:35:59 · 266 阅读 · 0 评论 -
杭电OJ2043
杭电OJ2043#include<cstdio>#include<string.h>int main(){ int n; char sp[7]={'~','!','@','#','$','%','^'}; scanf("%d",&n); while(n--){ char str[51]; int f1=0,f2=0,f3=0,f4=0; scanf("%s",str); if(strlen(str)<8||strlen(str)>16原创 2021-02-07 21:10:35 · 161 阅读 · 0 评论 -
杭电OJ2042
杭电OJ2042#include<cstdio>int main(){ int n; scanf("%d",&n); while(n--){ int x,count =3; scanf("%d",&x); for(int i =0;i<x;i++){ count=(count-1)*2; } printf("%d\n",count); } return 0;}原创 2021-02-07 20:40:43 · 124 阅读 · 0 评论 -
杭电OJ2041
杭电OJ2041这个题找规律 推公式第m-1阶台阶到第m阶有1种方法+1;第m-2阶台阶到第m阶有1种方法+2;所以 a[m] = a[m-1] + a[m-2]#include<cstdio>using namespace std;int main(){ int n; scanf("%d",&n); while(n--){ int x; int a[41]; scanf("%d",&x); a[1] = 0; a[2]= 1; a[3]=原创 2021-02-07 20:34:08 · 218 阅读 · 0 评论 -
杭电OJ2037
杭电OJ2037这里参考算法笔记的区间贪心问题注意排序算法中起始时间从大到小,当起始时间相同时,要把结束时间按照从小到大排序,这样能够选取小区间从而不冲突的区间数更多#include<cstdio>#include<algorithm>using namespace std;struct project{ int left,right;}I[100];bool cmp(project a,project b){ if(a.left!=b.left) return原创 2021-02-05 21:13:17 · 349 阅读 · 0 评论 -
杭电OJ2040
杭电OJ2040#include<cstdio>int main(){ int n; scanf("%d",&n); while(n--){ int x,y; int numx=0,numy=0; scanf("%d %d",&x,&y); for(int i =1;i<x;i++){ if(x%i==0){ numx+=i; } } for(int i =1;i<y;i++){ if(y%i==0)原创 2021-02-05 20:06:46 · 154 阅读 · 0 评论 -
杭电OJ2039
杭电OJ2039正数不是整数。。。。。。#include<cstdio>int main(){ int n; scanf("%d",&n); while(n--){ double x,y,z; scanf("%lf %lf %lf",&x,&y,&z); if((x+y)>z&&(x+z)>y&&(z+y)>x){ printf("YES"); }else{ pr原创 2021-02-05 18:44:49 · 149 阅读 · 0 评论 -
杭电OJ2036
杭电OJ2036这题是一道数学题 记住公式吧 若是不会这个公式 一般做不出来以一个点为基点,逐个分解三角形(ad+cf+be-ed-cb-af)/2.0a,b为起始点坐标 c ,d e,f为选取的三角形另外的两个坐标 带入公式即可#include<cstdio>using namespace std;float cacu(int a,int b,int c,int d,int e,int f){ return (a*d+c*f+b*e-e*d-c*b-a*f)/2.0原创 2021-02-05 13:37:48 · 275 阅读 · 0 评论 -
杭电OJ2035
杭电OJ2035这题数据范围太大很容易超过longlong类型的表示范围,所以在每次处理前取前三位即可#include<cstdio>using namespace std;int main(){ int n,m; while(scanf("%d %d",&n,&m)!=EOF){ if(n==0&&m==0){ break; } long long temp =n%1000; for(int i = 0 ;i<m-1;i+原创 2021-02-05 11:32:39 · 213 阅读 · 0 评论 -
杭电OJ2034
杭电OJ2034这个可以用到头函数algorithm简化代码#include<cstdio>#include<algorithm>using namespace std;int main(){ int n,m; while(scanf("%d %d",&n,&m)!=EOF){ if(n==0&&m==0){ break; } int a[100],b[100],c[100],flag,k=0; for(int原创 2021-02-05 11:08:51 · 175 阅读 · 0 评论 -
杭电OJ2033
杭电OJ2033#include<cstdio>int main(){ int n; while(scanf("%d",&n)!=EOF){ int hour[2],minute[2],second[2]; for(int i = 0;i<n;i++){ scanf("%d %d %d %d %d %d",&hour[0],&minute[0],&second[0],&hour[1],&minute[1],&se原创 2021-02-04 21:09:43 · 138 阅读 · 0 评论 -
杭电OJ2032
杭电OJ2032常规题#include<cstdio>int main(){ int n; int num[100][100]; while(scanf("%d",&n)!=EOF){ for(int i =1;i<=n;i++){ for(int j =1;j<=i;j++){ if(j<=i-1&&j>1){ num[i][j] = num[i-1][j]+num[i-1][j-1]; }else原创 2021-02-04 20:50:34 · 168 阅读 · 0 评论 -
杭电OJ2031
杭电OJ2031这道题的核心是除基取余法实现进制转换 ,可自行百度,一般应该都学过#include<cstdio>int main(){ int num[10000]; int x ,q; char temp = 'A'; while(scanf("%d%d",&x,&q)!=EOF){ int i = 0; if(x<0){ printf("-"); x=0-x; } do{ num[i++]=x%q; x=x/q;原创 2021-02-02 21:24:41 · 161 阅读 · 0 评论 -
杭电OJ2030
杭电OJ2030汉字机内码为负数且占两个字节,而其他文字不是负数。即转换为求负数的个数并除以二#include<stdio.h>#include<string.h>int main(){ char str[1000]; int n = 0,count=0; while(scanf("%d",&n)!=EOF){ getchar(); for(int i =0;i<n;i++){ count=0; gets(str); for(in原创 2021-01-22 20:32:06 · 194 阅读 · 0 评论 -
杭电OJ2029
杭电OJ2029用一下string函数库即可#include<stdio.h>#include<string.h>int main(){ int n = 0; char a[100]; while(scanf("%d",&n)!=EOF){ getchar(); for(int i =0;i<n;i++){ int flag =1; int k =1; gets(a); for(int j =0;j<(strlen(原创 2021-01-16 21:39:44 · 212 阅读 · 0 评论 -
杭电OJ2028
杭电OJ2028int 类型值有范围 直接相乘 会越界用long long范围数代替#include<stdio.h>int main(){ int n = 0; int a[100]; while(scanf("%d",&n)!=EOF){ long long amax = 1; for(int i =0;i<n;i++){ scanf("%d",&a[i]); amax *=a[i]; } for(int i = 1;i<原创 2021-01-16 21:22:33 · 316 阅读 · 0 评论 -
杭电OJ2027
杭电OJ2027注意输出格式特别注意:最后一块输出后面没有空行:))也就是说 不是最后一行 最后一个字母U两个换行符否则一个换行符#include<stdio.h>#include<string.h>int main(){ int n = 0; char b[101]; while(scanf("%d",&n)!=EOF){ getchar(); for(int j =0;j<n;j++){ gets(b); int a=0,e原创 2021-01-16 19:33:45 · 239 阅读 · 1 评论 -
杭电OJ2026
杭电OJ2026注意在while里也可以用gets函数,这里返回的是一个地址#include<stdio.h>#include<string.h>int main(){ char a[100]; while(gets(a)){ for(int i =0;i<strlen(a);i++){ if(i ==0){ a[i]= a[i]-32; }else{ if(a[i]==' '){ a[i+1] =a[i+1]-32;原创 2021-01-16 17:47:09 · 168 阅读 · 0 评论 -
杭电OJ2025
杭电OJ2025当成数组来处理就好了#include<stdio.h>#include<string.h>int main(){ char a[101]; while(scanf("%s",a)!=EOF){ int k = 0; for(int i = 0;i<strlen(a);i++){ if(a[k]<a[i]){ k=i; } } for(int i = 0;i<strlen(a);i++){ if(a原创 2021-01-16 16:58:03 · 125 阅读 · 0 评论 -
杭电OJ2024
杭电OJ2024这题我没注意到中间可以是数字、字母和下划线的组合 浪费半天时间#include<stdio.h>#include<string.h>int main(){ int n =0; char a[100][100]; while(scanf("%d",&n)!=EOF){ getchar(); for(int i = 0;i<n;i++){ int flag = 1; gets(a[i]); for(int j = 0;原创 2021-01-16 16:32:11 · 141 阅读 · 0 评论 -
杭电OJ2023
杭电OJ2023这题 还是格式问题笔记比较麻烦 不能多空格#include<stdio.h>int main(){ int m = 0,n = 0; int a[50][5]; while(scanf("%d %d",&n,&m)!=EOF){ double av[5],mv[50]; int k =0; for(int i= 0;i<n;i++){ for(int j = 0;j<m ;j++){ scanf("%d",&原创 2021-01-16 14:24:17 · 334 阅读 · 0 评论 -
杭电OJ2022
杭电OJ2022我代码用了C和c++的头函数 编译器记得选择G++ 不然无法AC#include<stdio.h>#include<cmath>int main(){ int m = 0,n = 0; int a[100][100]; while(scanf("%d %d",&m,&n)!=EOF){ int x=0,y=0,temp = 0; for(int i= 0;i<m;i++){ for(int j = 0;j<n ;原创 2021-01-13 21:09:22 · 262 阅读 · 0 评论 -
杭电OJ2021
杭电OJ2021常规数学题#include<stdio.h>int main(){ int n = 0; int a[100]; while(scanf("%d",&n)!=EOF){ if( n ==0){ break; } int bai = 0; int wushi = 0; int shi = 0; int wu =0; int er = 0; int yi = 0; for(int i = 0;i<n;i++){原创 2021-01-13 10:49:52 · 337 阅读 · 0 评论 -
杭电OJ2020
杭电OJ2020#include<stdio.h>int T(int x){ return x>0?x:-x;}int main(){ int n = 0; int a[100]; while(scanf("%d",&n)!=EOF){ if(n == 0){ break; } for(int i =0;i< n;i++){ scanf("%d",&a[i]); } for(int i =0;i<n-1;i++){原创 2021-01-12 17:31:16 · 171 阅读 · 0 评论 -
杭电OJ2019
杭电OJ2019常规题#include<stdio.h>int main(){ int n = 0,m = 0; int a[100]; while(scanf("%d %d",&n,&m)!= EOF){ if(n == 0&&m == 0){ break; } a[n] = m; for(int i = 0;i<n;i++){ scanf("%d",&a[i]); } for(int i = 0;i原创 2021-01-12 17:01:02 · 216 阅读 · 0 评论 -
杭电OJ2018
杭电OJ2018**这题直接算比较麻烦 用哪个和废弃那波数列相似的公式好算一点 感觉跟数学似的 **#include<stdio.h>int main(){ int n= 0 ; int a[55]; while(scanf("%d",&n)!=EOF){ if(n == 0){ break; } a[1] = 1; a[2] = 2; a[3] = 3; a[4] = 4; for(int i = 5;i<= n;i++)原创 2021-01-12 16:45:52 · 182 阅读 · 0 评论