- /************************************************************************/
- /* A+B
- Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
- Total Submission(s): 604 Accepted Submission(s): 380
- Problem Description
- 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开。
- 现在请计算A+B的结果,并以正常形式输出。
- Input
- 输入包含多组数据数据,每组数据占一行,由两个整数A和B组成(-10^9 < A,B < 10^9)。
- Output
- 请计算A+B的结果,并以正常形式输出,每组数据占一行。
- Sample Input
- -234,567,890 123,456,789
- 1,234 2,345,678
- Sample Output
- -111111101
- 2346912
- Source
- 浙大计算机研究生复试上机考试-2010年
- */
- /************************************************************************/
- #include"iostream"
- #include "string.h"
- #include "math.h"
- using namespace std;
- int trans(char *input)
- {
- //printf("%s",input);
- int res=0;
- int i,j;
- for (i=0;i<strlen(input);i++)
- {
- if(input[i]>='0'&&input[i]<='9')
- {
- res*=10;
- res+=(input[i]-'0');
- }
- }
- if(input[0]=='-')
- res=-res;
- return res;
- }
- int main()
- {
- char *inp1,*inp2;
- inp1=(char*)malloc(15*sizeof(char));
- inp2=(char*)malloc(15*sizeof(char));
- while(scanf("%s",inp1)!=EOF)
- {
- scanf("%s",inp2);
- int a=trans(inp1);
- int b=trans(inp2);
- printf("%d\n",a+b);
- }
- }
- /************************************************************************/
- /* ZOJ问题
- Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
- Total Submission(s): 657 Accepted Submission(s): 201
- Problem Description
- 对给定的字符串(只包含'z','o','j'三种字符),判断他是否能AC。
- 是否AC的规则如下:
- 1. zoj能AC;
- 2. 若字符串形式为xzojx,则也能AC,其中x可以是N个'o' 或者为空;
- 3. 若azbjc 能AC,则azbojac也能AC,其中a,b,c为N个'o'或者为空;
- Input
- 输入包含多组测试用例,每行有一个只包含'z','o','j'三种字符的字符串,字符串长度小于等于1000;
- Output
- 对于给定的字符串,如果能AC则请输出字符串“Accepted”,否则请输出“Wrong Answer”。
- Sample Input
- zoj
- ozojo
- ozoojoo
- oozoojoooo
- zooj
- ozojo
- oooozojo
- zojoooo
- Sample Output
- Accepted
- Accepted
- Accepted
- Accepted
- Accepted
- Accepted
- Wrong Answer
- Wrong Answer
- Source
- 浙大计算机研究生复试上机考试-2010年
- */
- /************************************************************************/
- /*analyse:
- Accept情况:(x----n个o,n>=1)
- 1. xzojx
- 2. (x)z(o*n)j(x*n)
- */
- #include "iostream"
- #include "string"
- using namespace std;
- int main()
- {
- char* inp;
- int o1,o2,o3,z,j,i;
- int flagz,flagj,flag;
- inp=(char*)malloc(1020*sizeof(char));
- while(gets(inp))
- {
- flagz=flagj=flag=0;
- for(i=0;i<strlen(inp);i++)
- {
- if(inp[i]=='z')
- flagz++,z=i;
- else if(inp[i]=='j')
- flagj++,j=i;
- else if(inp[i]!='o')
- flag=2;
- }
- if(flagz!=1||flagj!=1||flag!=0)
- {
- puts("Wrong Answer");
- continue;
- }
- o1=z;
- o2=j-z-1;
- o3=strlen(inp)-j-1;
- if(o1*o2==o3&&o2>=1)
- puts("Accepted");
- else
- puts("Wrong Answer");
- }
- }
- /************************************************************************/
- /* 奥运排序问题
- Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
- Total Submission(s): 690 Accepted Submission(s): 167
- Problem Description
- 按要求,给国家进行排名。
- Input
- 有多组数据。
- 第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
- 第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
- 接下来一行给出M个国家号。
- Output
- 排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例
- 对每个国家给出最佳排名排名方式 和 最终排名
- 格式为: 排名:排名方式
- 如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例
- 如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
- 每组数据后加一个空行。
- Sample Input
- 4 4
- 4 8 1
- 6 6 2
- 4 8 2
- 2 12 4
- 0 1 2 3
- 4 2
- 8 10 1
- 8 11 2
- 8 12 3
- 8 13 4
- 0 3
- Sample Output
- 1:3
- 1:1
- 2:1
- 1:2
- 1:1
- 1:1
- Source
- 浙大计算机研究生复试上机考试-2010年
- */
- /************************************************************************/
- #include "iostream"
- using namespace std;
- struct Nation
- {
- int jin;
- int jiang;
- int people;
- int index;
- int num[6];//num[0,1,2,3]record sort res,num[4]record min sort num, num[5] record min sort mode
- };
- int mode;
- int comp(const void *A,const void* B)
- {
- struct Nation* a=(Nation*)A;
- struct Nation* b=(Nation*)B;
- switch(mode)
- {
- case 1:
- return b->jin-a->jin;
- case 2:
- return b->jiang-a->jiang;
- case 3:
- return b->jin*a->people-a->jin*b->people;
- case 4:
- return b->jiang*a->people-a->jiang*b->people;
- }
- }
- bool Same(Nation a,Nation b,int mode)
- {
- switch(mode)
- {
- case 1:
- return a.jin==b.jin;
- case 2:
- return a.jiang==b.jiang;
- case 3:
- return a.jin*b.people==b.jin*a.people;
- case 4:
- return a.jiang*b.people==b.jiang*a.people;
- }
- }
- int main()
- {
- int n,m;
- while(scanf("%d%d",&n,&m)!=EOF)
- {
- int i,j,k=0,t;
- Nation* country=(Nation*)malloc(n*sizeof(Nation));
- Nation* c=(Nation*)malloc((m+10)*sizeof(Nation));
- Nation* res=(Nation*)malloc((m+10)*sizeof(Nation));
- for (i=0;i<n;i++)
- {
- scanf("%d%d%d",&country[i].jin,&country[i].jiang,&country[i].people);
- }
- for (i=0;i<m;i++)
- {
- scanf("%d",&t);
- c[k]=country[t];
- for(j=0;j<5;j++)
- c[k].num[j]=m+1;
- c[k++].index=i;
- }
- for (mode=4;mode>=1;mode--)
- {
- qsort(c,k,sizeof(c[0]),comp);
- c[0].num[mode-1]=1;
- for(i=1;i<k;i++)
- c[i].num[mode-1]=Same(c[i],c[i-1],mode)?c[i-1].num[mode-1]:(i+1);
- }
- for (i=0;i<k;i++)
- {
- for (mode=4;mode>0;mode--)
- {
- if (c[i].num[mode-1]<=c[i].num[4])
- {
- c[i].num[4]=c[i].num[mode-1];
- c[i].num[5]=mode;
- }
- }
- res[c[i].index]=c[i];
- }
- for(i=0;i<m;i++)
- printf("%d:%d\n",res[i].num[4],res[i].num[5]);
- cout<<endl;
- }
- }
- /************************************************************************/
- /* 最短路径问题
- Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
- Total Submission(s): 2114 Accepted Submission(s): 659
- Problem Description
- 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。
- Input
- 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数 s,t;起点s,终点。n和m为0时输入结束。
- (1<n<=1000, 0<m<100000, s != t)
- Output
- 输出 一行有两个数, 最短距离及其花费。
- Sample Input
- 3 2
- 1 2 5 6
- 2 3 4 5
- 1 3
- 0 0
- Sample Output
- 9 11
- Source
- 浙大计算机研究生复试上机考试-2010年
- */
- /************************************************************************/
- //这个是SPFA法,Dijkstra法见下个代码
- #include"iostream"
- #include"queue"
- #include"vector"
- using namespace std;
- #define N 1005
- #define INF 100000000
- int n,m;
- struct MAP
- {
- int node;
- int dis;
- int cost;
- MAP(int a,int d,int p)
- {
- node=a,dis=d,cost=p;
- }
- };
- vector<MAP>map[N];//map[i][j]表与节点i相连的第j条边的信息
- int minres[N][2];//min_dis/cost from s to i
- void spfa(int s,int e)
- {
- queue<int>Q;
- bool used[N]={false};
- Q.push(s);
- used[s]=true;
- int i;
- for(i=1;i<=n;i++)
- minres[i][0]=minres[i][1]=INF;
- minres[s][0]=minres[s][1]=0;
- while(!Q.empty())
- {
- int now=Q.front();
- Q.pop();
- used[now]=false;//
- for(i=0;i<map[now].size();i++)
- {
- int tmpend=map[now][i].node;
- int dis=map[now][i].dis;
- int cost=map[now][i].cost;
- if(minres[tmpend][0]>minres[now][0]+dis||
- (minres[tmpend][0]==minres[now][0]+dis&&
- minres[tmpend][1]>minres[now][1]+cost))
- {
- minres[tmpend][0]=minres[now][0]+dis;
- minres[tmpend][1]=minres[now][1]+cost;
- if(!used[tmpend])
- Q.push(tmpend);
- used[tmpend]=true;
- }
- }
- }
- }
- int main()
- {
- while(scanf("%d %d",&n,&m)!=EOF&&!(m==0&&n==0))
- {
- int a,b,d,p,i,j;
- for (i=1;i<=n;i++)
- map[i].clear();
- while (m--)
- {
- scanf("%d%d%d%d",&a,&b,&d,&p);
- map[a].push_back(MAP(b,d,p));//注意双向边
- map[b].push_back(MAP(a,d,p));
- }
- scanf("%d%d",&a,&b);
- spfa(a,b);
- printf("%d %d\n",minres[b][0],minres[b][1]);
- }
- }
- #include"iostream"
- #include"vector"
- using namespace std;
- #define N 1005
- #define INF 1000000000
- int n,m;
- struct Map
- {
- int point;//another point of edges connect this point
- int dis;
- int cost;
- Map(int x,int y,int z):point(x),dis(y),cost(z){}
- };
- vector<Map>map[N];
- int minres[N][2];
- void bfs(int s,int e)
- {
- int i,j;
- for(i=1;i<=n;i++)
- minres[i][0]=minres[i][1]=INF;
- minres[s][0]=minres[s][1]=0;
- bool used[N]={false};//false--in the end point set
- for(j=0;j<n;j++)//n loops
- {
- int mindis,mincost,tmp;
- mindis=mincost=INF;
- for(i=1;i<=n;i++)//find a point with min dis and min cost
- {
- if(!used[i]&&(minres[i][0]<mindis||minres[i][0]==mindis&&minres[i][1]<mincost))
- {
- mindis=minres[i][0];
- mincost=minres[i][1];
- tmp=i;
- }
- }
- int p1,d1,c1;
- //update paths connect to point tmp
- for (i=0;i<map[tmp].size();i++)
- {
- p1=map[tmp][i].point;
- d1=map[tmp][i].dis;
- c1=map[tmp][i].cost;
- if((minres[p1][0]>minres[tmp][0]+d1||
- minres[p1][0]==minres[tmp][0]+d1&&minres[p1][1]>minres[tmp][1]+c1)&&
- !used[p1])
- {
- minres[p1][0]=minres[tmp][0]+d1;
- minres[p1][1]=minres[tmp][1]+c1;
- }
- }
- used[tmp]=true;
- }
- }
- int main()
- {
- while(scanf("%d%d",&n,&m)!=EOF&&!(m==0&&n==0))
- {
- int a,b,d,p;
- for (int i=1;i<=n;i++)
- map[i].clear();///千万注意!
- while(m--)
- {
- scanf("%d%d%d%d",&a,&b,&d,&p);
- map[a].push_back(Map(b,d,p));
- map[b].push_back(Map(a,d,p));
- }
- scanf("%d%d",&a,&b);
- bfs(a,b);
- printf("%d %d\n",minres[b][0],minres[b][1]);
- }
- }