算法训练

1. 武功秘籍
小明到X山洞探险,捡到一本有破损的武功秘籍(2000多页!当然是伪造的)。 他注意到:书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上 。小明只想练习该书的第a页到第b页的武功,又不想带着整本书。请问他至少要撕下多少张纸带走?
有多组测试实例,输入小明想要练习的起始页a和末尾页b。(a<b)
81 92
7

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a,b;
	while(~(scanf("%d%d"),&a,&b)){
		int c=b/2-a/2+1;
		cout<<c<endl;
	}
}

2.Greedy Gift Givers 贪婪的送礼者
对于一群要互送礼物的朋友,TRW要确定每个人送出的钱比收到的多多少。在这一个问题中,每个人都准备了一些钱来送礼物,而这些钱将会被平均分给那些将收到他的礼物的人。然而,在任何一群朋友中,有些人将送出较多的礼物(可能是因为有较多的朋友),有些人有准备了较多的钱。给出一群朋友, 没有人的名字会长于 14 字符,给出每个人将花在送礼上的钱,和将收到他的礼物的人的列表,请确定每个人收到的比送出的钱多的数目。
输入
第 1 行:
人数NP,2<= NP<=10

第 2到 NP+1 行:
这NP个在组里人的名字 一个名字一行
第NP+2到最后:

这里的NP段内容是这样组织的:
第一行是将会送出礼物人的名字。
第二行包含二个数字: 第一个是原有的钱的数目(在0到2000的范围里),第二个NGi是将收到这个送礼者礼物的人的个数 如果 NGi 是非零的, 在下面 NGi 行列出礼物的接受者的名字,一个名字一行。

输出
输出 NP 行
每行是一个的名字加上空格再加上收到的比送出的钱多的数目。
对于每一个人,他名字的打印顺序应和他在输入的2到NP+1行中输入的顺序相同。所有的送礼的钱都是整数。
每个人把相同数目的钱给每位要送礼的朋友,而且尽可能多给,不能给出的钱被送礼者自己保留。
样例输入
5
dave
laura
owen
vick
amr
dave
200 3
laura
owen
vick
owen
500 1
dave
amr
150 2
vick
owen
laura
0 2
amr
vick
vick
0 0

样例输出
dave 302
laura 66
owen -359
vick 141
amr -150

#include<bits/stdc++.h>
using namespace std;
struct person
{
    char name[15];
    int money,give,get;
}f[11];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%s",f[i].name);
    }
    for(int i=0;i<n;i++)
    {
        char name[15];
        scanf("%s",name);
        int j;
        for(j=0;j<n;j++)
        {
            if(!strcmp(name,f[j].name)) break;
        }
        int giveout;
        scanf("%d%d",&f[j].money,&giveout);
        int each=0;
        if(f[j].money) each=f[j].money/giveout;
        f[j].give=each*giveout;
        char receivename[15]; 
        for(int k=0;k<giveout;k++)
        {
            scanf("%s",receivename);
            int x;
            for(x=0;x<n;x++)
            {
                if(!strcmp(receivename,f[x].name)) break;
            }
            f[x].get+=each;
        }
    }
    for(int i=0;i<n;i++)
    {
        int ans=f[i].get-f[i].give;
        printf("%s %d\n",f[i].name,ans);
    }

}

3. Airport Configuration
问题描述
  ACM机场是一个本地机场,对于大多数人来说,机场不是他们的终点或起点,而是中转站。机场有一个规划图。到达的大门在机场的北边(相当于空格)。出发的大门在机场的南边(也相当于空格)。两个正对着的大门距离相当于大门间的距离。每一个到达的大门只对应一个城市。每一个出发的大门也是这样。乘客到达的大门对应他们的起始城市,而出发大门对应他们的目标城市。因为这个问题,我们只需考虑转机的乘客。
  转机的乘客会产生机场的交通堵塞。我们已经知道某两个城市之间的平均客流量。用这些信息,有可能能降低交通堵塞。例如,Cx城到Cy城的客流量大,就可以将他们安排得很近,甚至是对位。
  因为花园和商店无法穿越,所以到达门G1和出发们G3(见图)的距离为1+2=3。
  你需要计算几个方案的客流指数。两个大门间的客流指数等于人数乘以距离。而总的客流指数就是所有门之间的客流指数之和。
在这里插入图片描述
输入格式
  输入文件有多组测试数据。
  最后一组只有一个0。
  每组测试数据的输入有两部分。先是客流数据,之后是机场布局。
  数据开始时一个n(1<n<25),表示城市数。接下来n行,每行表示一个城市的数据,第i行先是一个整数,表示起始城市,再一个1到n的整数k,表示目标城市数,k对整数,每对描述一个目标城市,第一个数是城市编号j,然后是乘客数目(最多500)从i到j的人数。
  机场布局部分包括1到20个方案。用一个0结束。
  一个方案包括3行。第一行一个数表示编号,第二行是1-n的一个排列,描述到达门对应的城市的排列,第三行用同样的方式描述出发大门。
输出格式
  对于每个测试数据,输出包括一个表格,表示方案编号和客流指数,按照客流指数升序输出。若客流指数相同,则编号小的排在前面。见样例。注意方案编号右对齐,而客流指数左对齐。(样例输出前面4个空格,后面9个空格,然后没有空格,详见未格式化的试题。
样例输入
3
1 2 2 10 3 15
2 1 3 10
3 2 1 12 2 20
1
1 2 3
2 3 1
2
2 3 1
3 2 1
0
2
1 1 2 100
2 1 1 200
1
1 2
1 2
2
1 2
2 1
0
0
样例输出
Configuration Load
2 119
1 122
Configuration Load
2 300
1 600

#include<bits/stdc++.h>
using namespace std;
int n;
int map1[107][107];
struct node{
	int num,sum;
}jichang[107];
bool camp1(node a,node b){
	if(a.sum!=b.sum) return a.sum<b.sum;
	else return a.num<b.num;
}
int main(){
	while(1){
		cin>>n;
		if(n==0) break;
		int a,b;
		memset(map1,0,sizeof(map1));
		for(int i=0;i<n;i++){
			cin>>a>>b;
			for(int i=0;i<b;i++){
				int c,d;
				cin>>c>>d;
				map1[a][c]=d;
			}
		}
		int h,i;
		int A[107],B[107];
		for(i=0;cin>>h&&h;i++){
			jichang[i].num=h;
			for(int j=1;j<=n;j++) cin>>A[j];
			for(int j=1;j<=n;j++){
				cin>>B[j];
				for(int k=1;k<=n;k++){
					jichang[i].sum+=map1[A[k]][B[j]]*((abs(k-j)+1));
				}
			}
		}
		sort(jichang,jichang+i,camp1);
		if(i!=0)
			cout << "Configuration Load" << endl;
		for (int j=0;j<=i-1;j++)
		{
			printf("%4d%9d\n",jichang[j].num,jichang[j].sum);//按格式输出
			jichang[j].sum=0;
			jichang[j].num=0; 
		}
	}
}
发布了19 篇原创文章 · 获赞 0 · 访问量 724

猜你喜欢

转载自blog.csdn.net/hahadelaochao/article/details/105713748