1001
#include <iostream>
#include <vector>
#include <iomanip>
#include <math.h>
#include <string>
#include <sstream>
#include <stack>
using namespace std;
int main(){
long long a,b;
cin>>a>>b;
string st;
stringstream ss;
ss<<(a+b);
ss>>st;
int th_count=0;
stack <char> sta;
for (int i=st.size()-1;i>=0;i--){
th_count++;
sta.push(st[i]);
if (i == 0){break;}
if (st[i-1] == '-'){sta.push(st[i-1]);break;}
if (th_count % 3 == 0&&th_count!=0){sta.push(',');}
}
while (!sta.empty()){cout<<sta.top();sta.pop();}
return 0;
}
总结陈词
1、long,int 和string的转化。参考链接。
https://blog.csdn.net/sunxianliang1/article/details/72897045
1002
下面这段代码显示部分正确, 原因未知,得分(17/25)
#include <iostream>
#include <vector>
#include <iomanip>
#include <math.h>
#include <string>
#include <sstream>
#include <stack>
using namespace std;
int main(){
float x;
vector <float> vc1;
vector <float> vc2;
vector <float> result;
int num;
cin>>num;
while(num--){
cin>>x;
vc1.push_back(x);
cin>>x;
vc1.push_back(x);
}
cin>>num;
while(num--){
cin>>x;
vc2.push_back(x);
cin>>x;
vc2.push_back(x);
}
unsigned int length;
if (vc1.size()<vc2.size()){length = vc1.size();}
else {length = vc2.size();}
unsigned int i,j;
i=0;j=0;
unsigned int length_copy = length;
float sum=0;
while(length_copy--){
if(vc1[i]<vc2[j]){result.push_back(vc2[j]);result.push_back(vc2[++j]);j++;sum++;}
else if(vc1[i]>vc2[j]){result.push_back(vc1[i]);result.push_back(vc1[++i]);i++;sum++;}
else{result.push_back(vc1[i]);result.push_back(vc1[++i]+vc2[++j]);i++;j++;sum++;}
if (i == length){while(j<vc2.size()){result.push_back(vc2[j++]);sum+=0.5;}break;}
if (j == length){while(i<vc1.size()){result.push_back(vc1[i++]);;sum+=0.5;}break;}
}
cout<<setiosflags(ios::fixed) << setprecision(0)<<sum;
for (unsigned int i=0;i<result.size();i++){
cout<<' ';
if (i&1)cout<<setiosflags(ios::fixed) << setprecision(1)<<result[i];
else{cout<<setiosflags(ios::fixed) << setprecision(0)<<result[i];}
}
return 0;
}
下面方法来自
https://blog.csdn.net/i_hope_soar/article/details/83064733
#include <iostream>
#include <iomanip>
using namespace std;
double a[1005];
int main(){
int n,k,x,m,count = 0;
double y;
cin>>m;
for(int i = 0; i < m; i++){
cin>>x>>y;
a[x] += y;
}
cin>>m;
for(int i = 0; i < m; i++){
cin>>x>>y;
a[x] += y;
}
for(int i = 0; i < 1001; i++){
if(a[i] != 0) count++;
}
cout<<count;
for(int i = 1001; i >= 0; i--){
if(a[i] != 0){
cout<<" "<<i<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<a[i];
}
}
return 0;
}
总结陈词
1、当如下情况时,++j会优先与cout计算,产生输出错误。
cout<<a[i]<<a[++i];//输出为两个a[i+1]
2、控制小数点位数参考链接
https://www.cnblogs.com/ever17/p/11285358.html
3、没有必要用vector容器,可以直接用数组预定数组空间。虽然有浪费,但是测试能过呀。
1003
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int MAXV = 1000;//最大顶点数
const int INF = 100000;//一个很大的数
int n;//顶点数
int m;//边数
int s;//起点序号
int G[MAXV][MAXV];
int d[MAXV];//起点到各点的路径长度
bool vis[MAXV] = {false};//true表示已访问
int man[MAXV];//各个结点救援人员数目
int mannum[MAXV];//从起点到各个点的聚集人数
int num[MAXV];//最短路径条数
void Dijkstra(int s){//s是起点
fill(d,d+MAXV,INF);//将数组设为INF
memset(num,0,sizeof(num));
memset(mannum,0,sizeof(mannum));
d[s] = 0;//s到自己的距离是0
mannum[s] = man[s];
num[s] = 1;
for (int i=0;i<n;i++){
int u = -1;
int MIN = INF;//u使得d[u]最小,MIN存放最小的d[u]
for (int j=0;j<n;j++){//找到为访问的顶点中的d[]最小的
if (vis[j] == false && d[j]<MIN){
u = j;
MIN = d[j];
}
}
//找不到小于INF,说明s和剩下的顶点不连通
if (u == -1){return;}
vis[u] = true;
for (int v=0;v<n;v++){
//v更优
if (vis[v] == false && G[u][v]!=INF){
if (d[u]+G[u][v]<d[v]){//路径更短
d[v] = d[u] + G[u][v];
mannum[v] = man[v]+mannum[u];
num[v] = num[u];
}
else if (d[u]+G[u][v] == d[v]){//路径相同选人多的,else if 不能变
if (mannum[v] < man[v]+mannum[u]){
mannum[v] = man[v]+mannum[u];
}
num[v] += num[u];
}
}
}
}
}
int main(){
//freopen("D://case.txt","r",stdin);
cin>>n>>m>>s;//输入顶点数,边数,起点
int goal;
cin>>goal;//目标结点
for (int i=0;i<n;i++){
cin>>man[i];
}
fill(G[0],G[0]+MAXV*MAXV,INF);//初始化
for (int i=0;i<m;i++){
int u,v,dis;
cin>>u>>v;//无向
cin>>dis;
G[u][v] = dis;//边权
G[v][u] = dis;//边权
}
Dijkstra(s);
cout<<num[goal]<<' ';
cout<<mannum[goal];
return 0;
}
1004
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
const int MAXN = 110;
vector <int> node[MAXN];
int n,m;//n结点数目,m非叶结点数目
int leaf[MAXN];//每层叶子结点数目
int maxh = 0;//最大高度,方便输出leaf
void DFS(int h,int index){//当前判断结点,第h层
maxh = max(maxh,h);
if (node[index].empty()){leaf[h]++;return;}
for (int i=0;i<node[index].size();i++){
DFS(h+1,node[index][i]);
}
}
int main(){
//freopen("D://case.txt","r",stdin);
std::ios::sync_with_stdio(false);//加速输入C++
cin>>n>>m;
for (int i=0;i<m;i++){
int father,k,kid;
cin>>father>>k;
for (int j=1;j<=k;j++){
cin>>kid;
node[father].push_back(kid);
}
}
DFS(1,1);
cout<<leaf[1];
for (int i=2;i<=maxh;i++){
cout<<' '<<leaf[i];
}
}
1005
https://pintia.cn/problem-sets/994805342720868352/problems/994805519074574336
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
using namespace std;
int result = 0;
void sum(char x){
result += x-'0';
}
stack <string> dig;//各个数字
void turn(int x){
switch(x){
case 1:
dig.push("one");break;
case 2:
dig.push("two");break;
case 3:
dig.push("three");break;
case 4:
dig.push("four");break;
case 5:
dig.push("five");break;
case 6:
dig.push("six");break;
case 7:
dig.push("seven");break;
case 8:
dig.push("eight");break;
case 9:
dig.push("nine");break;
case 0:
dig.push("zero");break;
}
}
int main(){
//freopen("D://case.txt","r",stdin);
std::ios::sync_with_stdio(false);//加速输入C++
string str;
cin>>str;
if (str == "0"){cout<<"zero";return 0;}
for (int i=0;i<str.size();i++){
sum(str[i]);
}
while(result!=0){
turn(result%10);
result = result/10;
}
cout<<dig.top();
dig.pop();
while(!dig.empty()){cout<<' '<<dig.top();dig.pop();}
return 0;
}