1001
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int a,b,result;
cin>>a>>b;
result=a+b;
if(result<0){
cout<<"-";
result=0-result;
}
if(result==0)
{
cout<<result;
return 0;
}
vector<int> ans;
while(result!=0)
{
int i=result%10;
ans.push_back(i);
result=result/10;
}
for(int i=ans.size()-1;i>=0;i--)
{
cout<<ans[i];
if(i!=0&&i%3==0)
cout<<',';
}
return 0;
}
1002
#include<iostream>
#include<cstdio>
using namespace std;
double ans[1001]={0};
int main()
{
int K,a;
double c;
cin>>K;
for(int i=0;i<K;i++)
{
cin>>a>>c;
ans[a]=c;
}
cin>>K;
for(int i=0;i<K;i++)
{
cin>>a>>c;
ans[a]=c+ans[a];
}
int num=0;
for(int i=0;i<1001;i++)
{
if(ans[i]!=0)num++;
}
cout<<num;
for(int i=1000;i>=0;i--)
{
if(ans[i]!=0){
printf(" %d %.1f",i,ans[i]);
}
}
}
运用map
#include<iostream>
#include<map>
#include<cstdio>
using namespace std;
map<int,double> ans;
int main()
{
int K,a;
double c;
cin>>K;
while(K--)
{
cin>>a>>c;
ans[a]=c;
}
cin>>K;
while(K--)
{
cin>>a>>c;
ans[a]=ans[a]+c;
if(ans[a]==0) ans.erase(a);
}
/*for(auto it=ans.begin();it!=ans.end();it++){
if(ans[a]==0) ans.erase(a);
}*/
cout<<ans.size();
for(auto it=ans.end();it!=ans.begin();)
{
it--;
printf(" %d %.1f",it->first,it->second);
}
}
1003
#include<iostream>
#include<vector>
using namespace std;
int N,M,C1,C2;//N城市数目,M道路数目,C1起点,C2终点
int num_of_team[501];
vector<int> road[501];
int dist[501][501];
int min_dist[501];
int paths,teams;
void dfs(int now_id,int now_length,int now_team)
{
if(min_dist[now_id]<now_length)return;//递归时不会递归回去的方法
if(now_id==C2){
if(min_dist[now_id]>now_length){
min_dist[C2]=now_length;
paths=1;
teams=now_team;
}
else{
paths++;
if(now_team>teams)teams=now_team;
}
}
else{
if(now_length<min_dist[now_id])min_dist[now_id]=now_length;
for(int i=0;i<road[now_id].size();i++){
dfs(road[now_id][i],now_length+dist[now_id][road[now_id][i]],now_team+num_of_team[road[now_id][i]]);
}
}
}
int main()
{
cin>>N>>M>>C1>>C2;
int i,j,k,l;
for(int i=0;i<N;i++) cin>>num_of_team[i];
while(M--){
cin>>i>>j>>l;
road[i].push_back(j);
road[j].push_back(i);
dist[i][j]=dist[j][i]=l;
}//图输入完毕
for(int i=0;i<N;i++) min_dist[i]=99999999;
dfs(C1,0,num_of_team[C1]);
cout<<paths<<' '<<teams;
}
1004
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 110;
vector<int> G[N];//N个结点
int leaf[N] = { 0 };//每一层的叶子结点的个数,N个结点顶多有N层,所以申请leaf[N]没有问题
int max_h = 1;
void DFS(int index, int h) {//深度遍历整个树,顺便记录树深,统计h层叶节点个数
max_h = max(h, max_h);
if (G[index].size() == 0) {
leaf[h]++;
return;
}
for (int i = 0; i < G[index].size(); i++) {
DFS(G[index][i], h + 1);
}
}
int main() {
int n, m, parent, child, k;
//n,结点个数;m,非叶节点个数;parent,非叶节点id;child,对应儿子节点id;k,儿子结点个数
cin >> n >> m;
for (int i = 0; i < m; i++)
{
cin >> parent >> k;
for (int j = 0; j < k; j++) {
cin >> child;
G[parent].push_back(child);
}
}
DFS(1, 1);
cout << leaf[1];
for (int i = 2; i <= max_h; i++) cout<<' '<< leaf[i];
return 0;
}
1005
#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
map<int,string> a;
string N;
void inio()
{
a[0] = "zero";
a[1] = "one";
a[2] = "two";
a[3] = "three";
a[4] = "four";
a[5] = "five";
a[6] = "six";
a[7] = "seven";
a[8] = "eight";
a[9] = "nine";
}
int main()
{
inio();
cin>>N;
int sum=0;
for (int i = 0; i < N.size(); i++)
{
sum += (int)N[i]-'0';
}
string s=to_string(sum);
for(int i=0;i<s.size();i++){
if(i>0) cout<<' ';
cout<<a[s[i]-'0'];
}
return 0;
}
1006
#include<iostream>
#include<string>
using namespace std;
//直接利用字典序比较大小,比较大小的方法为两个字符串从左往右比较字符,遇到小的字符,说明这个字符串小
int main()
{
string maxtime = "000000";
string mintime = "9999999";
int N;
cin >> N;
string id, sigh_in, sigh_out;
string minid, maxid;
while (N--) {
cin >> id >> sigh_in >> sigh_out;
if (sigh_in < mintime) { mintime = sigh_in; minid = id; }
if (sigh_out > maxtime) { maxtime = sigh_out; maxid = id; }
}
cout << minid << ' ' << maxid;
}
1007
#include<iostream>
using namespace std;
int a[10001] = { 0 };
int front[10001] = { 0 };
int main() {
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> a[i];
}
//计算前n项和
front[0] = a[0];
for (int i = 1; i <= N; i++) {
front[i] = front[i - 1] + a[i];
}
int dp[10001];//dp[i]表示以a[i]字符结尾的串的最大子串和是多少
dp[0] = 0;
int max = -1;
int left,right;
int lowest = 0;
for (int i = 1; i <= N; i++) {
if (dp[i - 1] + a[i] < a[i])//以a[i-1]字符结尾的最大子串给以a[i]结尾的最大子串形成了累赘
{
dp[i] = a[i];
lowest = i - 1;
}
else {
dp[i] = dp[i - 1] + a[i];
}
if (dp[i] > max) {
max = dp[i];
right = i;
left = lowest + 1;
}
}
if (max > -1)
{
cout << max << ' ' << a[left] << ' ' << a[right];
}
else
cout << 0 << ' ' << a[1] << ' ' << a[N];
}
1008
#include<iostream>
using namespace std;
int main(){
int N;
cin>>N;
int current=0;
int sum_time=0;
while(N--){
int k;
cin>>k;
if(current<k)//需要上楼
{
sum_time+=6*(k-current)+5;
current=k;
}
else{
sum_time+=4*(current-k)+5;
current=k;
}
}
cout<<sum_time;
}
1009
#include<iostream>
#include<iomanip>
using namespace std;
double a[1001] = { 0 };
double b[1001] = { 0 };
double c[2002] = { 0 };
void solve() {
for (int i = 0; i <= 1000; i++) {
for (int j = 0; j <= 1000; j++) {
c[i + j] += a[i] * b[j];
}
}
int cnt = 0;
for (int i = 2000; i >= 0; i--) {
if (c[i] != 0) ++cnt;
}
//printf("%d", cnt);
cout << cnt;
for (int i = 2000; i >= 0; i--) {
if (c[i] == 0) continue;
cout << ' ' << i << ' ' << setiosflags(ios::fixed) << setprecision(1) << c[i];
}
}
int main() {
int k, p;
double q;
cin >> k;
for (int i = 1; i <= k; i++) {
cin >> p >> q;
a[p] = q;
}
cin >> k;
for (int i = 1; i <= k; i++) {
cin >> p >> q;
b[p] = q;
}
solve();
return 0;
}
1010
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int trans(char c) {
int re = -1;
if (c >= '0' && c <= '9') { re = c - '0'; };
if (c >= 'a' && c <= 'z') { re = 10 + c - 'a'; }
return re;
}
int N_translate(string N, int radix)//将N转化为十进制的数
{
int unit = 1, sum = 0;
for (int i = N.size() - 1; i >= 0; i--) {
sum += trans(N[i]) * unit;
unit = unit * radix;
}
return sum;
}
int main() {
string N, U, N1, N2;
int tag, radix;
cin >> N1 >> N2 >> tag >> radix;
if (tag == 1) { N = N1; U = N2; }
if (tag == 2) { N = N2; U = N1; }//这样下来,radix就是N的进制,寻找U的一个最小进制r,U=N
int temp = N_translate(N, radix);
int Maxdigit = trans(U[0]);
for (int i = 1; i < U.size(); i++) {
if (trans(U[i]) > Maxdigit)Maxdigit = trans(U[i]);
}
int r2;
for (r2 = Maxdigit+1; N_translate(U, r2) < temp; r2++);
if (N_translate(U, r2) == temp) {
cout << r2;
}
else {
cout << "Impossible";
}
return 0;
}