第一次双周赛+基础存图
成都创新互联公司致力于成都网站设计、网站制作,成都网站设计,集团网站建设等服务标准化,推过标准化降低中小企业的建站的成本,并持续提升建站的定制化服务水平进行质量交付,让企业网站从市场竞争中脱颖而出。 选择成都创新互联公司,就选择了安全、稳定、美观的网站建设服务!#include
using namespace std;
char str1[1005],str2[1005];
int a[1005],b[1005],c[2010];
int zhuan(char c) //写个函数把字符转换为十进制
{
if(c>='0' && c<='9')
return c-'0';
else
return c-'A'+10;
}
int main()
{
cin>>str1>>str2;
int len1=strlen(str1);
for(int i=0;i a[i+1]=zhuan(str1[len1-i-1]); int len2=strlen(str2); for(int i=0;i b[i+1]=zhuan(str2[len2-i-1]);//把两个字符串倒序放入 int flag=0;//进位数 for(int i=1;i<=len1;++i) { flag=0;//注意每次清零 for(int j=1;j<=len2;++j) { c[i+j-1]+=a[i]*b[j]+flag; flag=c[i+j-1]/16; c[i+j-1]%=16; } c[i+len2]=flag; }//高精度相乘 int len3=len1+len2; while(c[len3]==0 && len3>1) len3--; for(int i=len3;i>=1;i--) { if(c[i]>=0 && c[i]<=9) cout< else cout<<(char)(c[i]-10+'A'); }//再把这个数转为16进制 return 0; } 查找每一个答案即可 #include using namespace std; int n,m,a[100005],y; bool check(int x) { int t = 0; for (int i = 1; i<= n; i++) { if (a[i]< t)//装不完弹就挂了 return false; if (a[i]<= t + m)//装完弹且在射程内 t += x; else { t += (a[i] - t - m);//装完弹还不在射程内 t += x; } } return true; } int main() { cin>>n>>m; for (int i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1); int L=0,R=a[n]; while (L+1 { int mid=(L+R)/2; if (check(mid)) L=mid; else R=mid; }//二分答案 cout< } 第四题:反向链表 #include const int X=1e5+5; using namespace std; int main(){ int Data[X],Next[X],list[X]; int FirstAdd,N,K; cin>>FirstAdd>>N>>K; for(int i=0;i { int tmpAdd,tmpData,tmpNext; cin>>tmpAdd>>tmpData>>tmpNext; Data[tmpAdd] = tmpData; Next[tmpAdd] = tmpNext; } int sum=0; // 累计有效结点数 while(FirstAdd!=-1) { // 当尾结点为 -1 时结束 list[sum++] = FirstAdd; // 记录所有Address FirstAdd = Next[FirstAdd]; // 找下一个结点 } for(int i=0;i ){ // 每 K 个结点一个区间 for(int j=0;j { // 反转链表 int t = list[i+j]; list[i+j] = list[i+K-j-1]; list[i+K-j-1] = t; } } for(int i=0;i printf("%05d %d %05d\n",list[i],Data[list[i]],list[i+1]); printf("%05d %d -1\n",list[sum-1],Data[list[sum-1]]); return 0; } #include using namespace std; const double N=1e-7; double a,b,c,d,p,q; int T; double check(double l,double r) { double x1=a*r*r*r+b*r*r+c*r+d;//右边界验证 while(r-l>N) { double mid=(r+l)/2; double x2=a*mid*mid*mid+b*mid*mid+c*mid+d;//判断中点 if (x1*x2<0) l=mid;//两点乘积小于零那么往右找 else r=mid;//否则往左找 } } int main() { cin>>T; while(T--) { cin>>a>>b>>c>>d>>p>>q; double j1=((-2*b)-sqrt(4*b*b-12*a*c)) / (6*a); double j2=((-2*b)+sqrt(4*b*b-12*a*c)) / (6*a); //先求导然后就可以分出三个区间 if (j1>j2) swap(j1,j2);//确保区间区间是递增的 printf("%.6lf %.6lf %.6lf",check(p,j1),check(j1,j2),check(j2,q));//分区间查找一下 } } 看了学长的教学就会了 #include using namespace std; const int N=1005; vector bool vis[N]; int st,ed,sum,cnt[N],n,m,x,y; void dfs(int now) { if (now==ed)//走到终点 { sum++; for (int i=1;i<=n;i++) if (vis[i]) cnt[i]++;//标记走过几次 return; } for (int i=0;i { int to =G[now][i];//下一步 if (!vis[to])//判断没走过 { vis[to]=true;//标记为走过 dfs(to);//接着搜下一步 vis[to]=false;//再次标记为没走过 } } } int main() { cin>>n>>m; for (int i=1;i<=m;i++) { cin>>x>>y; G[x].push_back(y); G[y].push_back(x);//无向图基础存图 } cin>>st>>ed; vis[st]=true;//把起点标记为走过 dfs(st); int ans=0; for (int i=1;i<=n;i++) { if (cnt[i]==sum) ans++; } ans=ans-2;//减去起点和终点 cout< return 0; } 这题知道反向dfs后就简单了,连我都独立搞定了 #include using namespace std; const int N=100005; int u,v,n,m,vis[N],ans[N]; vector void dfs(int x,int y) { if (vis[x]) return; ans[x]=y;//把第几个点序号放入ans数组 vis[x]=true;//标记为走过 for (int i=0;i dfs(G[x][i],y);//把第x行的图搜一遍 } int main() { cin>>n>>m; for (int i=1;i<=m;i++) { cin>>u>>v; G[v].push_back(u); //反向存 } //有向图基础存图 for (int i=n;i>=1;i--) dfs(i,i);//从后往前搜 for (int i=1;i<=n;i++) cout< return 0; } #include using namespace std; const int N = 10010; int n, m; vector bool vis[N]; int a[N],sum[3]; bool dfs(int now, int col) { vis[now] = true;//标记走过 a[now] = col; sum[col]++; for (int i = 0; i< g[now].size(); i++) { int to = g[now][i];//下一步 if (vis[to] && a[to] == a[now]) return false;//相邻了,不行 else if (!vis[to]) { if (!dfs(to, 3 - col)) return false; } } return true; } int main() { cin>>n>>m; for (int i = 1; i<= m; i++) { int u, v; cin>>u>>v; g[u].push_back(v); g[v].push_back(u); }//存图 int ans = 0; for (int i = 1; i<= n; i++) if (!vis[i])//没走过 { sum[1] = sum[2] = 0; if (!dfs(i,1)) { printf("Impossible"); return 0; }//没有符合条件的情况 ans += min(sum[1], sum[2]);//加上小的那个 } cout< return 0; } 你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网页题目:第一次双周赛+基础存图-创新互联
URL标题:http://cdweb.net/article/dpdico.html