您的位置:首页 > 编程语言 > PHP开发

2009 CSW Contest of JLU 解题报告(新生可看)

2010-10-19 19:13 381 查看
 马上就是2010级新生赛了,为了让帮助新生熟悉比赛,再次写出去年新生赛的题目题解,代码有些是我所写,也有孔牛的代码,可能有纰漏,请阅者见谅。

 

 

2600: 打印田字格

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

1s65536K1640281Standard
淘气小孩abc上课总是走神,今天又是如此,老师决定好好惩罚他一下,决定罚他写田字格(囧)。可是abc的作业本都被他折成各种各样的纸飞机了飞的无影无踪了,他已经没有作业本了。所以他哭着闹着找了你去帮他。 你的任务很简单。根据给出的宽度。生成田字格。田字格有*和空格组成。 其中田字格的宽度n已经给出。

Input

输入由多组测试数据组成。每组测试数据一行。一个整数n。

Output

对于每组测试数据。首先输出一行。Case号。以下输出一个田字格。在每组测试数据后输出一个空行。

Sample Input

1
2

Sample Output

Case 1:
*****
* * *
*****
* * *
*****

Case 2:
*******
*  *  *
*  *  *
*******
*  *  *
*  *  *
*******


 
Problem Source: zzc

 

This problem is used for contest: 140  141 
Submit / Problem List / Status / Discuss

#include<stdio.h>
int main()
{
int n,i,j;
int num=0;
int s;
while(scanf("%d",&n)!= EOF)
{
num++;
s=3+2*n;
printf("Case %d:/n",num);
for(i=1;i<=s;i++)
printf("*");
printf("/n");
for(i=1;i<=n;i++)
{printf("*");
for(j=1;j<=n;j++)
printf(" ");
printf("*");
for(j=1;j<=n;j++)
printf(" ");
printf("*");
printf("/n");
}
for(i=1;i<=s;i++)
printf("*");
printf("/n");

for(i=1;i<=n;i++)
{printf("*");
for(j=1;j<=n;j++)
printf(" ");
printf("*");
for(j=1;j<=n;j++)
printf(" ");
printf("*");
printf("/n");
}
for(i=1;i<=s;i++)
printf("*");
printf("/n");
printf("/n");
}
return 0;
}


 

 

 

2601: ICPC排行榜

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

1s65536K8913Standard
Final终于要在哈尔滨举行了。在比赛进行了4个小时的时候会封榜。你就看不到排名了。abc非常想提前知道最终的排名。所以他弄到了队伍列表和提交记录。你的任务很简单。根据队伍列表和提交记录生成最终的排行榜。所有提交记录以时间序给出。注意:队伍列表中有些队伍的末尾带一个*,这些队伍是不参与排名的。但是你要把他们放在排行榜中正确的位置上。*不是队伍名的一部分。为了简化,队伍名都是符合C标识符规则的字符串。题目是从A开始编号的。返回状态为Yes的题目为通过。否则未通过。排名以ICPC标准,先以题数排序,然后以时间排序。弱相同,维持原顺序。排名相同。

Input

本题包含多组测试数据。你需要处理到结尾。每组测试数据包括:的一行n,m,t。表示队伍的数量、提交记录的数量和题目的数量。一下n行。每行一个字符串,包含可选的*表示一支队伍。以下m行。每行表示一个提交记录。包括队伍名,提交的时间,提交的题目,返回状态。

Output

对于每组数据。首先输出一行Case号。之后输出排行榜。的一行排行榜头。Rank(4列)空一列 Teamname(20列左对齐)空一列还有题目号每个占7列。居中。solv/att通过的题目数和总的提交次数。注意一道题目通过之后再提交不计入总的提交次数里。 以下下n列每列表示一个学校的状态。排序输出。即先输出第一名。。然后第二名。排名按照ICPC标准。即先以题数排序。然后以时间排序。时间为每道题的时间总和(第一次通过的时间+之前错误的次数*20)正确处理*的队伍。你的输出需要与排行榜头对齐。参见样例。在每组数据后输出一个空行。

Sample Input

4 6 5
hunters*
hah
acac
dust
hunters 4 A Yes
hunters 8 B Yes
hah 9 C Yes
acac 9 C Yes
hunters 90 C CE
hunters 90 E TLE

Sample Output

Case 1:
Rank Team                 Solved Time    A       B       C       D       E    att/sol
---- hunters*             2      12     1/4     1/8     1/---   0/---   1/---   4/2
1    hah                  1      9      0/---   0/---   1/9     0/---   0/---   1/1
1    acac                 1      9      0/---   0/---   1/9     0/---   0/---   1/1
3    dust                 0      0      0/---   0/---   0/---   0/---   0/---   0/0


 
Problem Source: zzc

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

 

 

#include <iostream>
#include <string>
using namespace std;
struct team{
string name;
int id;
int sub[20],tim[20],ok[20];
int totok,tottim,totsub;
}te[1001];
int n;
void clear(team* k){
memset(k->sub,0,sizeof(k->sub));
memset(k->ok,0,sizeof(k->ok));
memset(k->tim,0,sizeof(k->tim));
k->totok=k->tottim=k->totsub=0;
}
int getid(string s){
int i,j;
for(i=0;i<n;i++){
if(te[i].name.size()<s.size())continue;
if(te[i].name.size()==s.size()){
for(j=0;j<s.size();j++){
if(te[i].name[j]!=s[j])break;
}
if(j==s.size())return i;
}
if(te[i].name.size()==s.size()+1&&te[i].name[te[i].name.size()-1]=='*'){
for(j=0;j<s.size();j++){
if(te[i].name[j]!=s[j])break;
}
if(j==s.size())return i;
}
}
}
bool cmp(team a,team b){
if(a.totok!=b.totok)return a.totok>b.totok;
if(a.tottim!=b.tottim)return a.tottim<b.tottim;
return a.id<b.id;
}
int main(){
//freopen("in.txt","r",stdin);
//freopen("o.txt","w",stdout);
int m,p,i,ca=1,ppi;
while(cin>>n>>m>>p){
for(i=0;i<n;i++){
clear(&te[i]);
te[i].id=i;
}
for(i=0;i<n;i++){
cin>>te[i].name;
}
string s,sta;
char ph;
int ti,id,pro;
for(i=0;i<m;i++){
cin>>s>>ti>>ph>>sta;
if(i!=0&&ti<ppi)while(1);
ppi=ti;
id=getid(s);
pro=ph-'A';
if(te[id].ok[pro]==1)continue;
else {
if(sta=="Yes"){
te[id].tim[pro]=ti;
te[id].ok[pro]=1;
te[id].sub[pro]++;
te[id].totok++;
//te[id].totsub+=te[id].sub[pro];
te[id].tottim+=(te[id].sub[pro]-1)*20+ti;
te[id].totsub++;
}
else {
te[id].sub[pro]++;
te[id].totsub++;
}
}
}
sort(te,te+n,cmp);
printf("Case %d:/n",ca++);
printf("Rank Team                 Solved Time ");
for(i=0;i<p;i++){
printf("   ");
printf("%c",'A'+i);
printf("    ");
}
printf("att/sol/n");
// while(1);
int pre,sum,prek,j;
sum=0;
pre=-1;
for(i=0;i<n;i++){
if(te[i].name[te[i].name.size()-1]=='*'){
printf("---- ");
}
else {
if(pre==-1){
printf("%-5d",1);
pre=i;
prek=1;
sum++;
}
else {
if(te[i].totok==te[pre].totok&&te[i].tottim==te[pre].tottim){
printf("%-5d",prek);
}
else {
printf("%-5d",sum+1);
pre=i;
prek=sum+1;
}
sum++;
}
}
cout<<te[i].name;
for(j=0;j<21-te[i].name.size();j++)putchar(' ');
//printf("%-21s",te[i].name);
printf("%-7d",te[i].totok);
printf("%-5d",te[i].tottim);
for(j=0;j<p;j++){
if(te[i].ok[j]==1){
printf("%3d",te[i].sub[j]);
printf("/");
printf("%-4d",te[i].tim[j]);
}
else {
printf("%3d",te[i].sub[j]);
printf("/");
printf("--- ");
}

}
printf("%3d",te[i].totsub);
printf("/");
printf("%-3d",te[i].totok);
cout<<endl;
}
cout<<endl;
}
}


 

 

2602: 斐波那契数列

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

1s65536K899214Standard
abc的数学老师刚教了他们斐波那契数列。斐波那契数列数列的每一项是前两项的和。斐波那契数列的相邻两项之比趋近黄金分割虑。现在abc正在研究斐波那契数列的令一项性质。就是斐波那契数列的前n项和Sn。(斐波那契数列的前两项 fib[1]=1,fib[2]=1) abc需要知道一个整数sum大概是斐波那契数列的前多少项和。但是一个一个的算太麻烦了。不擅长变成的abc找到了你。记斐波那契数列的前n项和为Sn。给出一个整数Sum。求n使得S(n) <= Sum < S(n + 1) Sum在int范围内。

Input

本题有多组输入数据组成。每组数据为一个整数sum占一行。

Output

对于每组数据。首先输出一行Case号。下一行输出一个整数n。在每组数据之后输出一个空行。

Sample Input

3

Sample Output

Case 1:
2


 
Problem Source: zzc

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

 

#include<stdio.h>
int main()
{
int n;
int sum,a,b,i,num,t;
num=0;
while (scanf("%d",&n)!= EOF)
{
num++;
sum=2;
a=1;b=1;
i=1;
while(sum<=n)
{
t=a+b;
a=b;
b=t;
sum+=b;
i++;
}
printf("Case %d:/n",num);
printf("%d/n",i);
printf("/n");
}
return 0;
}


 

 

2603: 2012世界末日

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

10s65536K22484Standard
     种种迹象表明,公元2012年为世界末日,而科学家们进一步预测,人类将被一种神秘的时空机器送到另一个宇宙,所以不要害怕,我们只是搬了个新家而已~

     每一次改变都是一种进步,这个新的世界并不像我们的地球,不再有南方北方(不倒翁已为此头疼很久),不再有贫富贵贱,人们也不会再因为自己的长像头疼,因为同性别的人都变成了一个模样。当然,最大的不同是,人们发现这个世上的人并不只有男和女两种性别,性别种数变得不确定(想必找工作不会再有性别歧视了,大男子小女子的说法也将不复存在),还好人们保持了同性互斥,异性相吸的特性,只有不同性别的人才愿意走在一起。

     十年后的一天,jlu的Boss:Dr.Lee想请ACM校队的成员一起吃个饭,注意这些成员的性别可能都已变化。可以肯定的是,校队的人数不会超过12,性别数不会超过10。Dr.Lee家里有一张长长的沙发,洽好能坐下所有学生(Dr.Lee一直在忙着做饭),JLU_ACMes都还正常,当然都希望坐在自己身边的人与自己不同性别。Dr.Lee是个数学爱好者,他很想知道一共有多少种坐法能够让自己的学生们都满意?但他意识到可能的种数会很多,想求助2009级的ACMer们~

     现在已知这次参加聚餐的ACMers共有n种性别,每种性别的人数也已知,你的任务是,输出共有多少种入坐方案,使得相邻的ACMers异性。

     例如: 3种性别时,有1个人性别是1,两个人性别是2,三个人性别是3,则共有以下10种方案:

1 3 2 3 2 32 3 1 3 2 32 3 2 3 1 33 1 2 3 2 33 1 3 2 3 2
3 2 1 3 2 33 2 3 1 2 33 2 3 1 3 2
3 2 3 2 1 33 2 3 2 3 1
 

Input

     每行第一个数是ACMers的性别种数n(n<=10),接着的n个数分别表示各种性别ACMer的人数(总人数不超过12)。

Output

     满足题设要求的方案数。

Sample Input

3 1 2 3

Sample Output

10


 
Problem Source: SongLijun

 

This problem is used for contest: 140  150 

Submit / Problem List / Status / Discuss

#include<stdio.h>
int sum,n,m;
int a[20],f[20];
void dfs(int depth)
{
int i;
if(depth==sum)
{
m++;
return;
}
for(i=0;i<n;i++)
if(i+1!=f[depth-1]&&a[i]>0)
{
f[depth]=i+1;
a[i]--;
dfs(depth+1);
a[i]++;
}
}
int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
sum=0;
m=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
dfs(0);
printf("%d/n",m);
}
return 0;
}


 

 

2604: clever ACMer

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

1s65536K329177Standard
近日Peter得了种怪病,一看课本就犯困,持续了一段时间后他的成绩直线下滑。Peter非常着急,于是去天机宫找神医homeboy,但是homeboy只给聪明人看病,只有通过考核才有资格被他医治。于是他给Peter出了一道题:给定两种操作+1 或 ×2 ,从1变到n所需要的最少操作数是多少? 作为一名ACMer,Peter没几分钟就做出了这道题,homeboy非常欣赏他,用其祖传的玄幻神针治好了Peter。自此,Peter又变回了以前那个好学的少年。 计算机前的你能做出来吗?

Input

输入一个整数n,n<=2^32-1,当n=0时,退出。

Output

输出从1变到n所需要的最少操作数。

Sample Input

1
2315
176
0

Sample Output

0
1 26
9


 
Problem Source: hujiafeng

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

#include<stdio.h>
int main()
{
unsigned int n; int num;
while((scanf("%d",&n),n)!=0)
{
num=0;
while (n>=3)
{
if (n % 2==0)
{n=n/2; num++;}
if (n%2 !=0 )
{n=n-1;num++;}
}
if (n==3) num+=2;
if (n==2) num+=1;
printf("%u/n",num);
}
return 0;
}


 

2605: 字符串的值

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

1s65536K647190Standard
ww是一个聪明的gg,可是他不喜欢英语却喜欢研究算法。他总说我是一个爱国的人所以不学英语,但是程序设计确实十分的有趣,他认为英文单词和一个字符串没有什么区别。 所以他根本不可能分辨一个句子。可是英语考试又是一个事实,所以他绞尽脑汁想出了一个方法去判断两个句子是否相同。 每个字符都有一个值。A-Z分别为1-26,不计大小写。其他字符为0。一个字符串的值就是一个字符串中所有字符的值的和。 当然,在abc眼中一个句子就是一个字符串。 他分辨两个句子的方法就是看两字符串(句子)的值是否相同。 你的任务不是分辨两个句子,而是求一个句子(字符串)的值。 句子中可能包含空格和标点。

Input

输入有多组测试数据组成。每个测试数据占一行。一个字符串。你需要处理到输入结束。

Output

对于每组测试数据。首先输出一行。Case号。之后一行输出一个整数,该字符串的值。在每组数据后输出一个空行。

Sample Input

abc
a *

Sample Output

Case 1:
6

Case 2:
1


 
Problem Source: zzc

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

#include<stdio.h>
char l(char c)
{
if ( c>='A' && c<= 'Z') return c+'a'-'A';
else return c;
}
int main ()
{
int num,sum,i;
char s[1000];
num=0;
while (gets(s) != 0)
{
num++;
sum=0;
i=0;
while(s[i]!= '/0')
{
if ( l(s[i])>='a' && l(s[i])<='z')
{
sum+=l(s[i])-'a'+1;
}
i++;
}
printf("Case %d:/n",num);
printf("%d/n",sum);
printf("/n");
}
return 0;
}


 

 

2606: 星空

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

1s65536K21921Standard
sky是一个喜欢浪漫的人,对浩淼的星空总是有无穷的幻想,每天晚上他都会在独院里听着music,欣赏着银河的璀璨,可是随着时间的的延续,他发现天空中的每颗星的亮度竟都是不同的。而且每一秒都在不停的闪烁,亮度总是不同,真是神奇的自然,他看到天上的n颗星辰,他记得爷爷曾经告诉他星星在第s初时的亮度分别为l[1][0]~l
[0],每一秒,在同一时刻的同一瞬间,第n颗星的亮度增加m,第n-1颗星的亮度增加这个时候的第n颗星的亮度,第i颗星的亮度增加这个时候第i+1颗星的亮度,sky不禁感慨这世界的奇妙,这些所有的变化竟都恰恰集中在1s内完成,sky真想预言出ts末在璀璨的星空中,各颗星究竟是怎样的亮度

Input

输入由多组数据组成。每组数据包括:三个整数n, m, t (0 < n <= 50, 0 < t <= 10^9) n个整数l[1][0]~l
[0]

Output

对于每组数据的一行输出Case号。之后输出n行,每行一个整数表示每颗星的亮度 模 2345的值每组数据之后输出一个空行。

Sample Input

3 1 31 2 3

Sample Output

Case 1:
35
17
6


 
Problem Source: zzc

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=101;
const int mod = 2345;
class Matrix
{
int n,m;//矩阵的row and colum
int num[maxn][maxn];//从1开始
public:
Matrix(){memset(num,0,sizeof(num));}
Matrix(const Matrix &a) {n=a.n;m=a.m; memcpy(num,a.num,sizeof(a.num));}
Matrix(int x,int y):n(x),m(y){}
Matrix & operator =(const Matrix & a);
friend Matrix operator + (const Matrix &a,const Matrix &b);
friend Matrix operator - (const Matrix &a,const Matrix &b);
friend Matrix operator * (const Matrix &a,const Matrix &b);
friend Matrix operator % (const Matrix &a,int n);
friend ostream & operator <<(ostream & cout,const Matrix & a);
friend istream & operator >>(istream & cin,Matrix & a);
void Modefy_n_m(int x,int y,int v);
void out();//只在此题中有用,其他题目可删去
};
Matrix & Matrix:: operator =(const Matrix &a)
{
for(int i=1;i<=a.n;i++) for(int j=1;j<=a.m;j++) num[i][j]=a.num[i][j];
}
istream & operator >>(istream & cin,Matrix & a)
{
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=a.m;j++)
{
cin>>a.num[i][j];
}
}
return cin;
}
ostream & operator <<(ostream & cout,const Matrix & a)
{
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=a.m;j++)
{
cout<<a.num[i][j]<<"   ";
}
cout<<endl;
}
return cout;
}
Matrix operator % (const Matrix &a,int n)
{
Matrix t(a.n,a.m);
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=a.m;j++)
{
t.num[i][j]=a.num[i][j]%n;
}
}
return t;
}
Matrix operator * (const Matrix &a,const Matrix &b)
{
Matrix t(a.n,b.m);
for(int i=1;i<=a.n;i++)
{
for(int j=1;j<=b.m;j++)
{
int cnt=0;
for(int k=1;k<=a.m;k++)
{
cnt+=a.num[i][k]*b.num[k][j];
cnt%=mod;//这是此题需要,别的题目可删去
}
t.num[i][j]=cnt;
}
}
return t;
}
Matrix operator + (const Matrix &a,const Matrix &b)
{
Matrix t(a.n,a.m);
for(int i=1;i<=a.n;i++) for(int j=1;j<=a.m;j++) t.num[i][j]=a.num[i][j]+b.num[i][j];
return t;
}
Matrix operator - (const Matrix &a,const Matrix &b)
{
Matrix t(a.n,a.m);
for(int i=1;i<=a.n;i++) for(int j=1;j<=a.m;j++) t.num[i][j]=a.num[i][j]-b.num[i][j];
return t;
}
void Matrix:: Modefy_n_m(int x,int y,int v)
{
num[x][y]=v;
}
void mul(Matrix &a,int t,Matrix temp)
{
if(t==1) return ;
if(t==2)
{
a=a*a;
return ;
}
mul(a,t/2,temp);
a=a*a;
if(t&1) a=a*temp;
}
void Matrix::out()
{
for(int i=1;i<m;i++) printf("%d/n",num[1][i]);
printf("/n");
}
int main()
{
int n,m,t;
int pl=1;
while(scanf("%d%d%d",&n,&m,&t)==3)
{
Matrix tt(1,n);
cin>>tt;
Matrix a(1,n+1);a=tt;a.Modefy_n_m(1,n+1,m);
Matrix temp(n+1,n+1);
for(int i=1;i<=n+1;i++) for(int j=1;j<=i;j++) temp.Modefy_n_m(i,j,1);
Matrix tmp(temp);
mul(temp,t,tmp);
a=a*temp;
printf("Case %d:/n",pl++);
a.out();
}
return 0;
}


 

 

 

2607: Last time see you again

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

3s131072K808Standard
大学的时光是值得怀念的,有多少事情珍藏在我们的记忆里,又有多少人我们一辈子都忘不掉。 123abc是一个不起眼的小男孩,他曾经在很多方面努力过,也经历了很多失败,在这些努力和失败中,他收获了自己的人生。 whx是123abc认识的一个女生,123abc很喜欢她,总是用各种方法想见到她,可是whx生气了, 她不想见到123abc,这令123abc很伤心。 whx明天就要离开吉林大学了,123abc想看她最后一眼,虽然whx不想看到不起眼的123abc,但是123abc只想看她最后一眼,内心默默祝福她。根据可靠线报,whx将从地点1出发,最后到达地点n (2<=n<=10000),然后离开长春,这是最后一次机会,123abc不想错过这次机会,于是他也得到了长春市的所有地形。每个地点被标号为1—n,其中1表示吉林大学,n表示火车站,其他表示长春市的其他地点,若两个地点有公交车或者轻轨直达,则之间有一条路(这是一个无向图,注意啊)。边数为m(0<=m<=400000). 123abc现在想知道,除了吉林大学和火车站,还有多少地方一定可以等到whx(因为地点1和n太明显了,whx会更生气的,还是邂逅比较好)。

Input

每组测试数据第一行n和m,接下来的m行每行两个数x,y(1<=x<=n,1<=y<=n),表示地点x和地点y是可以相互到达的。每组测试数据以空行结束。

Output

分为三种情况; 1.从1到n没有路,则输出Information Error! 2.从1到n的路都经过的点数(除了1和n)为0,输出Poor 123abc! 3.否则输出这样地点的个数

Sample Input

2 1
1 2

3 0

8 6
1 2
1 32 33 8
8 5
8 6


Sample Output

Poor 123abc!
Information Error!
1


 
Problem Source: 123abc

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

 

#include<cstdio>
#include<cstring>
const int V=10010;
const int E=800010;
int deep[V],ans[V]; //深度和访问的最小主先
int head[V],e;
int n,m,cnt,sum;
struct EDGE
{
int v,next;
} edge[E];
inline int min(int x,int y)
{
return x<y?x:y;
}
void addedge(int u,int v)
{
edge[e].v=v;
edge[e].next=head[u];
head[u]=e++;
}
void dfs(int u,int fa)
{
int sons=0, tofather=0;
deep[u]=ans[u]=cnt++;
for(int p=head[u]; p!=-1; p=edge[p].next)
{
sons++;
int v=edge[p].v;
if(v==u) continue;
int tag=deep
;
if (deep[v]==-1)
{
dfs(v,u);
ans[u]=min(ans[u], ans[v]);
if ((fa==-1 && sons>1) || (fa!=-1 && ans[v] >= deep[u]))
{
if (u != 1 && u != n && tag == -1 && deep
!= -1)
{
sum++;
}
}
}
else if (v != fa || tofather) ans[u] = min(ans[u], deep[v]);
if (v==fa) tofather=1;
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
e=0;
cnt=0;
memset(head,-1,sizeof(head));
memset(deep,-1,sizeof(deep));
memset(ans,-1,sizeof(ans));
for(int i=1; i<=m; i++)
{
int x,y;
scanf("%d%d",&x,&y);
addedge(x,y);
addedge(y,x);
}
sum=0;
dfs(1,-1);
if (deep
==-1)
{
printf("Information Error!/n");
continue;
}
if (sum==0)
printf("Poor 123abc!/n");
else
printf("%d/n",sum);
}
return 0;
}


 

 

2608: 石子

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

1s131072K480120Standard
Xiao Tang和Xiao Jiang非常喜欢玩一种有趣的小游戏: 有N个石子,两人轮流从中取出1个, 3个或4个石子,当石子被取空时,游戏结束。最后一个取石子的人获胜, 第一次总是Xiao Tang取. 当然,他们俩都足够聪明,总会采取最优的策略。

Input

每行会有一个正整数N(N<=100000), 代表石子的个数, N=0 代表输入结束

Output

输出获胜人的名字。

Sample Input

1
20

Sample Output

Xiao Tang
Xiao Jiang


 
Problem Source: homeboy

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

 

#include<stdio.h>
int main()
{
int num;int max;
int n;
num=0;
max=0;
int b[100000];
while((scanf("%d",&n),n)!=0)

{
b[1]=1;b[2]=0;b[3]=1;b[4]=1;b[5]=1;b[6]=1;

if (n>6)
{
if ((n-6) % 7==1 || (n-6)% 7==3)
printf("Xiao Jiang/n");
else
printf("Xiao Tang/n");
}
else

{
if (b
==0)
printf("Xiao Jiang/n");
else
printf("Xiao Tang/n");
}
}

return 0;
}


 

 

2609: sequence

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

4s65536K11221Standard
有一个数列a[1], a[2], ..., a
(n>=3) 。每次可以从中任意挑出三个相邻的数 a[i-1], a[i], a[i+1] (i>=2), 进行如下操作: (a[i-1], a[i], a[i+1]) --> (a[i-1]+a[i], -a[i], a[i]+a[i+1]) 给定初始序列和目标序列,是否能够通过以上操作,将初始序列转化为目标序列?

Input

每个case的第一行有一个整数N(3<=N<=1000), 代表序列中数的个数第二行有N个整数代表初始序列第三行有N个整数代表目标序列 N=0代表输入的结束

Output

若能转换输出Yes, 否则输出No

Sample Input

30 0 0
1 1 1

6
1 6 9 4 2 0
7 -6 19 2 -6 6

0

Sample Output

No
Yes


 
Problem Source: homeboy

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int i,n;
int a[1000],b[1000];
while((scanf("%d",&n),n)!=0)
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(i!=0)
a[i]+=a[i-1];
}
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
if(i!=0)
b[i]+=b[i-1];
}
sort(a,a+n);
sort(b,b+n);
for(i=0;i<n;i++)
{
if(a[i]!=b[i])
break;
}
if(i==n)
printf("Yes/n");
else
printf("No/n");
}
return 0;
}


 

 

2610: grid

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

1s65536K15552Standard
百无聊赖寒假日,TY在家实在太无聊了, =___________=b, 他用一些1*1*1的小正方体积木堆出了一个a*b*c的长方体(a, b, c分别是长,宽,高) 为了不让TY太过无聊,JJX给他出了个有意思的题目: 这个长方体的"体对角线"——坐标化后从点(0, 0, 0)到点(a, b, c)的线段, 一共能穿过多少个小正方体?

Input

每行三个正整数a, b, c,代表长方体的长, 宽, 高。a, b, c均为 0 时代表输入结束

Output

穿过的小正方体的个数

Sample Input

1 1 1
2 3 4
0 0 0

Sample Output

1
6


 
Problem Source: homeboy

 

This problem is used for contest: 140 

Submit / Problem List / Status / Discuss

#include<stdio.h>
int gcd(int a,int b)
{
if(a<b) return gcd(b,a);
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
while(a!=0&&b!=0&&c!=0)
{
int t;
t=a+b+c-gcd(a,b)-gcd(a,c)-gcd(b,c)+gcd(gcd(a,b),c);
printf("%d/n",t);
scanf("%d%d%d",&a,&b,&c);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息