做起来还是不是特别顺手。。。
题目地址:点击打开链接
1001:
题目大意:就是个A+B,不过需要控制输出格式,注意一下就可以了,多写点测试数据。
AC代码:
<span style="font-size:18px;">//water</span>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int s[10];
int ss[10];
int main()
{
int a,b,i;
while(cin>>a>>b)
{
int t=0;
int c=a+b;
int flag=0;
if(c==0)
{
puts("0");
continue;
}
if(c<0)
{
flag=1;
c=-c;
}
while(c)
{
s[t++]=c%1000;
c/=1000;
}
for(i=0;i<t;i++)
ss[i]=s[t-1-i];
if(flag)
{
printf("-");
}
printf("%d",ss[0]);
for(i=1;i<t;i++)
{
printf(",%03d",ss[i]);
}
printf("\n");
}
return 0;
}
/*
123 321
999 -999
999 1
*/
1002:
题目大意:给你两个多项式,然后相加即可,如果多项式的系数是0,就不输出。。
AC代码:
//water
//#include "stdafx.h"
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=2000005;
double a[maxn];
int main()
{
int k,i,p;
double x;
while(cin>>k)
{
memset(a,0,sizeof(a));
for(i=0;i<k;i++)
{
cin>>p>>x;
a[p]+=x;
}
cin>>k;
for(i=0;i<k;i++)
{
cin>>p>>x;
a[p]+=x;
}
int sum=0;
for(i=0;i<=maxn-1;i++)
{
if(fabs(a[i])>=0.1)
sum++;
}
cout<<sum;
for(i=maxn-1;i>=0;i--)
{
if(fabs(a[i])>=0.1)
printf(" %d %.1f",i,a[i]);
}
cout<<endl;
}
return 0;
}
/*
2 1 2.4 0 3.2
2 2 1.5 1 0.5
2 1 -2.4 0 -3.2
2 2 -1.5 1 -0.5
2 1 -2.4 0 0.5
2 2 -1.5 1 2.4
*/
1003:
题目大意:给你n个节点,每个节点有自己的权值,m条路,每条路有自己的长度,问你从起点c1到终点c2的最短路有多少条,并且在这些最短路中找一条使得这条路沿行的点的权值加起来最大。
解题思路:带回溯的dfs,其实开始不敢写,因为有500层,抱着试一试的心态还是果断地写了。
AC代码:
//带回溯的dfs,不是500层么。。
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=502;
int wei[maxn];
int visi[maxn];
int mp[maxn][maxn];
int len,cnt,peo; //最短路长度,最短路个数,最大人数
int n,c2;
void dfs(int from,int ct,int l)
{
if(len!=-1&&l>len)
return;
if(from==c2)
{
if(len==-1||l<len)
{
len=l;
cnt=1;
peo=ct;
}
else if(l==len)
{
cnt++;
if(ct>peo)
peo=ct;
}
return;
}
for(int i=0;i<n;i++)
{
if(!visi[i]&&mp[from][i]!=-1)
{
visi[i]=1;
dfs(i,ct+wei[i],l+mp[from][i]);
visi[i]=0;
}
}
}
int main()
{
int m,c1;
int i;
while(cin>>n>>m>>c1>>c2)
{
for(i=0;i<n;i++)
cin>>wei[i];
memset(mp,-1,sizeof(mp));
memset(visi,0,sizeof(visi));
int x,y,val;
for(i=0;i<m;i++)
{
cin>>x>>y>>val;
mp[x][y]=val;
mp[y][x]=val;
}
len=-1,cnt=0,peo=0;
visi[c1]=1;
dfs(c1,wei[c1],0); //从哪个点,人数,长度
cout<<cnt<<" "<<peo<<endl;
}
return 0;
}
/*
5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
*/
1004:
题目大意:给你一颗树,1是根,从根遍历,然后输出每一层的叶子节点的个数。
解题思路:直接dfs,但是有一个坑点,如果某一层没有节点了,那么不再输出。。这个也比较容易理解,因为不再是针对这颗树了,比如这颗树只有7层,我们却输出了10层。。
AC代码:
//有一个坑点:当前层没有节点的话就不输出。。
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
vector <int> mq[105];
int ans[105];
int n,m;
void dfs(int cur,int lv)
{
if(ans[lv]==-1) ans[lv]=0;
int i;
if(mq[cur].size()==0)
ans[lv]++;
for(i=0;i<mq[cur].size();i++)
{
int nex=mq[cur][i];
if(lv+1<=n)
dfs(nex,lv+1);
}
}
int main()
{
int i,j;
while(cin>>n>>m)
{
for(i=1;i<=n;i++)
mq[i].clear();
int root,num,x;
for(i=0;i<m;i++)
{
cin>>root>>num;
for(j=0;j<num;j++)
{
cin>>x;
mq[root].push_back(x);
}
}
memset(ans,-1,sizeof(ans)); //记录从root下来每一层有多少叶子
dfs(1,1);
for(i=1;i<=n;i++)
{
if(ans[i]!=-1)
{
if(i>1) cout<<" ";
cout<<ans[i];
}
else break;
}
}
return 0;
}
/*
2 1
01 1 02
*/