177 条题解
-
-6
虽然这种简单题写个快读确实是大材小用,但是有了快读,这个程序的主程序就可如python一般简洁因此就有了这篇题解,大家就当学快读的写法吧qwq
#include <bits/stdc++.h> using namespace std; inline int read() { int X = 0; bool f = false; char ch = getchar(); while (ch > '9' || ch < '0') {f |= ch == '-'; ch = getchar();} while (ch <= '9' && ch >= '0') {X = (X << 3) + (X << 1) + (ch ^ 48); ch = getchar();} return f ? -X : X; } inline void write(int X) { if (X == 0) {putchar('0'); return;} if (X < 0) {putchar('-'); X = -X;} short num[21], cnt = 0; while (X) {num[++cnt] = X % 10; X /= 10;} while (cnt) putchar(num[cnt--] ^ 48); return; } int main() { write(read() + read()); return 0; }
-
-8
水一篇题解哈哈哈哈哈
声明:为了不错误引导新手上路,我会区分新手和神犇的解题方法(当然神犇不是我)
新手请看这里:
#include<iostream> using namespace std; int main() { int a,b; //定义a,b两数,数据规模巨大的话用long long int也不是不可~ cin>>a>>b; //输入a,b cout<<a+b; //输出a+b的结果,等同于int c=a+b; cout<<c; return 0; //return 0好习惯 }
神犇请看这里:(高精度加法)
先用字符串数组,以字符形式储存两个大数。再依次储存被加数,加数,和。之后再将字符数字转为四位一块的整数数字,逐块相加,并进位,最后计算和的块的总数即可。
#include <bits/stdc++.h> #define N 200 int Pow(int a, int b) { int i = 0, result = 1; for(i = 0; i < b; ++i) { result *= a; } return result; } int main() { char stra[N], strb[N]; int i = 0, step = 4, carry = 0; int lengtha, lengthb, maxlength, resultsize; int numa[N], numb[N],numc[N]; memset(numa, 0, sizeof(numa)); memset(numb, 0, sizeof(numb)); memset(numc, 0, sizeof(numc)); scanf("%s%s", stra, strb); lengtha = strlen(stra); lengthb = strlen(strb); for(i = lengtha-1; i >= 0; --i) { numa[(lengtha-1-i)/step] += (stra[i]-'0')*Pow(10,(lengtha-1-i)%step); } for(i = lengthb-1; i >= 0; --i) { numb[(lengthb-1-i)/step] += (strb[i]-'0')*Pow(10,(lengthb-1-i)%step); } maxlength = lengtha > lengthb ? lengtha : lengthb; for(i = 0; i <= maxlength/step; ++i) { numc[i] = (numa[i] + numb[i])%Pow(10, step) + carry; carry = (numa[i] + numb[i])/Pow(10, step); } resultsize = numc[maxlength/step] > 0 ? maxlength/step : maxlength/step - 1; printf("%d", numc[resultsize]); for(i = resultsize-1; i >= 0; --i) { printf("%04d", numc[i]); } printf("\n"); return 0; }
-
-11
本人太弱不会a+b,只能冲一发退火来碰碰运气
#include<bits/stdc++.h> #define ll long long using namespace std; const double d=0.999; const double lim=1e-10; ll a,b; ll ans; ll num; int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { x=x*10+(ch^48); ch=getchar(); } return x*f; } int calc(int x) { return abs(a+b-x)-abs(a+b-ans); } void ghost_fire() { double T=1000000; while(T>lim) { int x=num+((rand()<<1)-RAND_MAX)*T; int del=calc(x); if(del<0) { ans=x; num=x; } else if(exp(-del/T)>(double)rand()/RAND_MAX) num=x; T*=d; } } void work() { for(int i=1;i<=100;i++) ghost_fire(); } int main() { a=read(); b=read(); work(); cout<<ans<<endl; return 0; }
-
-13
上代码:
#include<bits/stdc++.h> using namespace std; void dfs(int a,int b,int ans,int flag) { if(flag){printf("%d",ans);exit(0);} dfs(a,b,a+b,flag+1); // 加法 } int main() { string s=""; getline(cin,s); // 输入 int a=0,b=0,flag=0,fa=1,fb=1; // fa:a符号,fb:b符号 for(int i=0;i<s.size();i++) { if(s[i]==' ') flag=1;// 遇到空格读下一个数 if(s[i]=='-') { if(flag) fb=-1; else fa=-1; } if(s[i]>='0'&&s[i]<='9') { if(flag) b=(b<<1)+(b<<3)+(s[i]^48);// b*10+s[i]-'0' else a=(a<<1)+(a<<3)+(s[i]^48);// a*10+s[i]-'0' } } dfs(a*fa,b*fb,0,0); return 0; }
这题还是挺简单的
-
-36
用线段树+标记永久化即可
#include <cstdio> #define mid L + (R-L >> 1) const int maxn = 1e5+5; int n, a[maxn], m; int sl, sr, add; struct segtree{ int sum[maxn<<2], tag[maxn<<2]; inline int lc(int o){return o<<1;} inline int rc(int o){return o<<1|1;} void build(int o, int L, int R){ if(L == R){sum[o] = a[L];return;} int M = mid; build(lc(o), L, M); build(rc(o), M+1, R); sum[o] = sum[lc(o)] + sum[rc(o)]; } void maintain(int o, int L, int R){ if(R>L){ sum[o] = sum[lc(o)] + sum[rc(o)]; sum[o] += tag[o] * (R-L+1); } else { sum[o] += tag[o]; tag[o] = 0; } } void updata(int o, int L, int R){ if(sl <= L && R <= sr)tag[o] += add; else{ int M = mid; if(sl <= M)updata(lc(o), L, M); if(sr > M)updata(rc(o), M+1, R); } maintain(o, L, R); } int query(int o, int L, int R, int tags){ if(sl <= L && R <= sr)return sum[o] + tags * (R-L+1); else { int M = mid, res = 0; if(sl <= M)res += query(lc(o), L, M, tags+tag[o]); if(sr > M)res += query(rc(o), M+1, R, tags+tag[o]); return res; } } } sol; signed main(){ n = 1; int a, b; scanf("%d%d", &a, &b); sol.build(1, 1, n); add=a; sl=1; sr=1; sol.updata(1, 1, 1); add=b; sol.updata(1, 1, 1); printf("%d\n", sol.query(1, 1, n, 0)); return 0; }
当然,树状数组也可以,并且更快
#include <iostream> using namespace std; const int n = 1; int a, b; int c[500005]; inline int lowbit(int x){ return x & (-x); } inline int sum(int x){ int ans=0; for(int i=x;i>0;i-=lowbit(i)) ans+=c[i]; return ans; } void add(int x,int y){ for(int i=x;i<=n;i+=lowbit(i)) c[i]+=y; } int main(){ cin>>a>>b; add(1, a); add(1, b); printf("%d\n", sum(1)); return 0; }
-
-37
C++11の高端的题解!
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<string> #include<cstdlib> using namespace std;//超长无关紧要的高端的头文件 int a,b;//定义高端的变量 int main(){ scanf("%d%d",&a,&b);//快速读入高端的变量 printf("%d",a+b);//经过简简单单的高端的计算后,快速输出高端的结果! return 0;//高端而潇洒的结尾~ }
看这高端的注释,不点个赞吗?
-
-41
高精度水一发......
#include <iostream> #include <string> #include <algorithm> using namespace std; string a,b; int x[1005],y[1005],ans[1005]; int main() { cin>>a>>b; int la=a.size(),lb=b.size(); reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); int n,i,j; for(i=0;i<la;i++) x[i]=a[i]-'0'; for(i=0;i<lb;i++) y[i]=b[i]-'0'; int temp,jin=0; for(i=0;i<1000;i++) { temp=x[i]+y[i]+jin; if(temp>=10) { jin=1; ans[i]=temp-10; } if(temp<10) { jin=0; ans[i]=temp; } } for(i=1000;i>=0;i--) if(ans[i]!=0) break; for(;i>=0;i--) { cout<<ans[i]; } return 0; }
信息
- ID
- 56
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 1
- 标签
- 递交数
- 10363
- 已通过
- 4682
- 上传者