3
已解决
孟昭旭
初级光能
初级光能
纯纯萌新,请多关照
1.闰年判断
bool leapyear(int year){ //判断year是否为闰年,是返回true,不是返回false
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
return true;
else
return false;
}
2.素数判断
int prime(int n){ //判断n是否为素数,是返回1,不是返回0
for (int i = 2; i <=sqrt (n); i++)
if (n%i == 0)
return 0;
return 1;
}
3.回文数判断
int f(int n){//判断n是否是回文数,是返回1,否则返回0
int t=0,m=n;
while(m) {//如果m不等于0,执行下面循环,否则跳出循环 (求这个数各位上数字反向排列的数 )
t*=10;
t+=m%10;
m/=10;
}
return t==n;//如果这个数各位数字反向排列所得数依然等于该数,该数就是回文数
}
勿**
孟昭旭在2022-08-09 20:14:57追加了内容
@万韧山 @陈雨泽 感谢指出
判断回文(双指针)
bool hw(int n){
int a[100],cnt=0;
while(n!=0){
a[++cnt]=n%10;
n/=10;
}
int i=1;
while(i<=cnt){
if(a[i]!=a[cnt]) return 0;
i++;
cnt--;
}
return 1;
}
想不到吧我还有一种方法 判断回文数/串
int fun(string a) {
//判断字符串a是否是回文串,是返回1,否则返回0。也适用于判断数字是否回文数
int flag=1;
int len=a.size();
for(int i=0;i<=len/2;i++) {
if(a[i]!=a[len-i-1]) {
flag=0;
break;
}
}
return flag;
}
@万韧山 感谢补充
最大公约数与最小公倍数
int gcd(int x,int y){ //用辗转相除法,求x和y的最大公约数
if(x<y){ //保证两个数的x>y
int t=x;
x=y;
y=t;
}
int r;
while(y>0) {
r=x%y;
x=y;
y=r;
}
return x;
}
int lcm(int x,int y){ //求x和y的最小公倍数
return x*y/gcd(x,y);
}
孟昭旭在2022-08-26 19:38:02追加了内容
@李牧晓
额。。。。。。
我现在就结贴好叭
0
已采纳
李牧晓
中级天翼
中级天翼
我要以下回答:
1、是不是从我这借鉴的灵感创作的这个帖?
2、有没有想过标明出处?
3、有没有翻过以前的帖查看有没有相同的?
我是第一次被模仿 可能要求有点多 请见谅
1
万韧山
初级天翼
初级天翼
补充一下回文数的另一个模板
是判断的
bool hw(int n){
int a[100],cnt=0;
while(n!=0){
a[++cnt]=n%10;
n/=10;
}
int i=1;
while(i<=cnt){
if(a[i]!=a[cnt]) return 0;
i++;
cnt--;
}
return 1;
}
最大公约数
long long gcd(long long a,long long b){
long long r;
while(b!=0)
{
r=a%b;
a=b;
b=r;
}
return a;
}
1
陈雨泽
资深光能
资深光能
bool hw(string s) {
int l=0,r=s.size()-1;
while(l<r) {
if(s[l]!=s[r])
return false;
l++; r--; }
return true; }
1
1
陈则霖
资深光能
资深光能
两个坐标点之间的直线距离:
头文件:#include<cstdio>
函数部分:
int zxjl(int a,int b,int c,int d)
{
return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
可能有错,因为是纯现打
赶紧补充上
ps支持,但是你还有好多没有补上,比如深度优先搜索,广度优先搜索,01背包,还有最基**的文件操作,(当然,还有很多。)有很多很重要的建议赶快补上。就这样了。
0
0
0
0
李显晨
中级启示者
中级启示者
图论之最短路径算法模板:
Floyd:
memset(dis,0x3f,sizeof(dis));
for(int i=1; i<=m; i++) dis[u][v] = dis[v][u] = w;
for(int k=1; k<=n; k++)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
Dijkstra:
1.不优化:
void Dijkstra(int s) {
memset(found, false, sizeof(found));
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
while(true) {
int u = -1;
for(int i=1; i<=n; i++)
if(!found[i]&&(u==-1||dis[i]<dis[u])) u = i;
if(u==-1) return;
found[u] = true;
for(int i=1; i<=n; i++) dis[i] = min(dis[i], dis[u]+cost[u][i]);
}
}
2.堆优化
void dijkstra(int st){
memset(dis,0x3f,sizeof(dis));
q.push(P(st,0));
dis[st]=0;
while(!q.empty()){
P h=q.top(); q.pop();
int u=h.first;
if(dis[u]<h.second) continue;
// 小根堆里的队首元素 是最小值,如果满足此条件说明已经被更新过了,就不需要再更新。
dis[u]=h.second;
for(int i=0;i<g[u].size();i++){
edge e=g[u][i];
if(dis[e.next]>dis[u]+e.w){
dis[e.next]=dis[u]+e.w;
q.push(P(e.next,dis[e.next]));
}
}
}
}
3.Prim:
int MST_prim(){
int ans=0;
memset(dis,0x3f,sizeof(dis));
memset(found,false,sizeof(found));
dis[1]=0;
while(1){
int u=-1;
for(int i=0;i<=n;i++){
if(!found[i]&&(u==-1||dis[i]<dis[u])) u=i;
}
if(u==-1) break;
found[u]=true;
ans+=dis[u];
for(int i=0;i<=n;i++){
if(!found[i]&&g[u][i]<dis[i]) dis[i]=g[u][i];
}
}
return ans;
}
4.Kruscal
bool cmp(node x,node y){
return x.w<y.w;
}
void init(){
for(int i=1;i<=n;i++)
fa[i]=i;
}
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void unite(int x,int y){
x=find(x);
y=find(y);
if(x==y) return ;
fa[x]=y;
}
bool same(int x,int y){
return find(x)==find(y);
}
int main(){
cin>>n>>m>>k;
for(int i=1,u,v,w;i<=m;i++){
cin>>u>>v>>w;
a[i]=(node){u,v,w};
}
sort(a+1,a+1+m,cmp);
init();
for(int i=1;i<=m;i++){
if(!same(a[i].u,a[i].v)){
unite(a[i].u,a[i].v);
ans+=a[i].w;
cnt++;
}
if(按题意来) break;
}
if(按题意来) cout<<"No Answer";
else cout<<ans;
}
5.Ford:
bool Ford(int s) {
memset(dis, 0x3f, sizeof(dis));
dis[s] = 0;
for(int i=1; i<n; i++)
for(int j=1; j<=n; j++)
for(int k=0; k<g[j].size(); k++) {
edge e = g[j][k];
dis[e.adj] = min(dis[e.adj], dis[j]+e.w);
}
for(int i=1; i<=n; i++)
for(int j=0; j<g[i].size(); j++) {
edge e = g[i][j];
if(dis[e.adj]>dis[i]+e.w) return false;
}
return true;
}
6.SPFA(不稳定,一般不要使用)
void SPFA(int s) {
memset(dis, 0x3f, sizeof(dis));
memset(exist, false, sizeof(exist));
dis[s] = 0;
q.push(s);
exist[s] = true;
while(!q.empty()) {
int h = q.front();
q.pop();
exist[h] = false;
for(int i=0; i<g[h].size(); i++) {
edge e = g[h][i];
if(dis[e.nxt]>dis[h]+e.w) {
dis[e.nxt] = dis[h]+e.w;
if(!exist[e.nxt]) {
q.push(e.nxt);
exist[e.nxt] = true;
}
}
}
}
}
0
汪宇航
新手启示者
新手启示者
...这...确实挺**的
bfs模板:
while(!q.empty()){
int h=q.front();
++pp;
if(h+g[h]<=n && !vis[h+g[h]]){
cnt[h+g[h]]=cnt[h]+1;
vis[h+g[h]]=true;
q.push(h+g[h]);
}
if(h-g[h]>0 && !vis[h-g[h]]){
cnt[h-g[h]]=cnt[h]+1;
vis[h-g[h]]=true;
q.push(h-g[h]);
}
q.pop();
}
求解转判定模板:
while(l<r){
int mid=(l+r)/2;
if(ch(mid))r=mid;
else l=mid+1;
}
return l;
最长公共子序列模板:
for(int i=1;i<=la;i++)
for(int j=1;j<=lb;j++){
if(a[i]==b[j]){
f[i][j]=f[i-1][j-1]+1;
g[i][j]=1;
}else{
if(f[i-1][j]>f[i][j-1]){
f[i][j]=f[i-1][j];
g[i][j]=3;
}else{
f[i][j]=f[i][j-1];
g[i][j]=2;
}
}
}
最长不下降子序列模板:
for(int i=1;i<=n;i++){
f[i]=1;
for(int j=1;j<i;j++){
if(a[j]>=a[i]){
f[i]=max(f[i],f[j]+1);
}
}
ans=max(ans,f[i]);
}
最大连续子序列和模板:
#include<bits/stdc++.h>
using namespace std;
int n,a[100005],f[100005],t;
int main(){
cin>>t;
while(t--){
cin>>n;
int mx=-2147483647;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i]=max(f[i-1]+a[i],a[i]);
mx=max(mx,f[i]);
}
cout<<mx<<"\n";
}
return 0;
}
前缀和模板:
while(n--){
cin>>a;
p+=a;
cout<<p<<"\n";
}