7-1 N个数求和
写了蛮久 我做水题的能力太差了 明天得把周练题目全部a了
还是有一个超时
#include <bits/stdc++.h> using namespace std; long gvs(long a,long b); int main() { int n;cin>>n; long a[105][2]; for(int i=1;i<=n;i++) { scanf("%ld/%ld",&a[i][0],&a[i][1]);//printf("1:%d/%d ",a[i][0],a[i][1]); } for(int i=1;i<=n-1;i++) { int g=gvs(a[i][1],a[i+1][1]); // printf("g=%d ",g); a[i+1][0]=a[i+1][0]*(g/a[i+1][1]); //printf("%d ",a[i+1][0]); a[i][0]=a[i][0]*(g/a[i][1]); //printf("%d ",a[i][0]); a[i+1][0]+=a[i][0];//printf("%d ",a[i+1][0]); a[i+1][1]=g;//printf("%d ",a[i+1][1]); } //printf("%d/%d ",a[n][0],a[n][1]); int f=0; if(a[n][0]<0){f=1;printf("-");a[n][0]=-a[n][0];} if(a[n][0]==0)printf("0"); long num=a[n][0]/a[n][1]; a[n][0]%=a[n][1]; if(num!=0&&a[n][0]!=0) printf("%d ",num); else if(num!=0)printf("%d",num); if(a[n][0]!=0) { for(int i=a[n][0];i>0;i--) { if(a[n][0]%i==0&&a[n][1]%i==0){if(f)printf("-"); printf("%ld/%ld",a[n][0]/i,a[n][1]/i); break;} } } return 0; } long gvs(long a,long b) { if(a>b){int t=a;a=b;b=t;} for(long i=a;;i+=a) { if(i%a==0&&i%b==0)return i; } }
看了别人的 最大公约数辗转相除 快了很多
并且边读边处理更加好
#include <stdio.h> long long gcd(long long a,long long b)//求最大公约数。 { if(a == 0) return 0; else return (b == 0) ? a : gcd(b, a % b); } int main() { int N; long long lcp;//用以记录最小公倍数 long long a,b,c,d; int i = 1; scanf("%d",&N); scanf("%lld/%lld",&a,&b); int t0 = gcd(a,b); if(a) { a /= t0; b /= t0; } while(i < N) { scanf("%lld/%lld",&c,&d); lcp = b / gcd(b,d) * d;//通过最大公约数换算出两个分母的最小公倍数 a = a * lcp / b + c * lcp / d;//通分后分子和 b = lcp; int t0 = gcd(a,b); if(t0 != 0)//从扩大最小公倍数之后的形式变换回来 { a = a / t0; b = b / t0; } i++; } if(a && a/b == 0)/// 整数部分为0 且 a不为 0 printf("%lld/%lld ",a%b,b); else if(a%b == 0)/// 小数部分为0 printf("%lld ",a/b); else printf("%lld %lld/%lld ",a/b,a%b,b); return 0; }
7-3 A-B
本题要求你计算A−B。不过麻烦的是,A和B都是字符串
自己写1: 有一个点超时
#include <bits/stdc++.h> using namespace std; int main() { string s,a; getline(cin,s); getline(cin,a); for(int i=0;i<a.size();i++) { for(int k=0;k<s.size();k++) { if(a[i]==s[k]) { for(int j=k;j<s.size();j++) { s[j]=s[j+1];} k--; } } } cout<<s; return 0; }
想到向量 过了 最好不要map<char,int> char就是int
#include <bits/stdc++.h> using namespace std; int main() { string s,a; getline(cin,s); getline(cin,a); vector<char>ans; map<int,int>m; for(int i=0;i<a.size();i++) { m[a[i]]=1; } for(int i=0;i<s.size();i++) { if(m[s[i]]!=1)ans.push_back(s[i]); } //printf("%d",ans.size()); for(int i=0;i<ans.size();i++) cout<<ans[i]; return 0; }
7-9 集合相似度
用了三个set 所以有一个点超时了
#include <bits/stdc++.h> using namespace std; set<long>a[60]; int main() { set<long>s; int n;cin>>n;long x; for(int i=1;i<=n;i++) { int c; cin>>c; for(int k=1;k<=c;k++) {cin>>x;a[i].insert(x);} } int k;cin>>k;int q,w; int c[2000][2]; for(int i=1;i<=k;i++) { cin>>c[i][0]>>c[i][1]; } for(int i=1;i<=k;i++) { s.clear(); q=c[i][0];w=c[i][1]; int n1=a[q].size()+a[w].size(); for (set<long>::iterator it = a[q].begin(); it != a[q].end(); ++it) { s.insert(*it); } for (set<long>::iterator it = a[w].begin(); it != a[w].end(); ++it) { s.insert(*it); } int n2=s.size(); printf("%.2lf%% ",100.0*(n1-n2)/n2); } return 0; }
优化了代码 很多时候不一定要对两个进行操作 对一个就行了 可以变读入边输出 省下一个C数组
#include <bits/stdc++.h> using namespace std; set<long>a[60]; int main() { set<long>s; int n;cin>>n;long x; for(int i=1;i<=n;i++) { int c; scanf("%d",&c); for(int k=1;k<=c;k++) {scanf("%ld",&x);a[i].insert(x);} } int k;cin>>k;int q,w; for(int i=1;i<=k;i++) { s.clear(); scanf("%d%d",&q,&w); int n1=a[q].size()+a[w].size();int c=0; for (set<long>::iterator it = a[q].begin(); it != a[q].end(); ++it) { if(a[w].count(*it))c++; } printf("%.2lf%% ",100.0*(c)/(n1-c)); } return 0; }