周赛题

UESTC - 1034
AC Milan VS Juventus
Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu

SubmitStatus

Description

Kennethsnow and Hlwt both love football.

One day, Kennethsnow wants to review the match in 2003 between AC Milan and Juventus for the Championship Cup. But before the penalty shootout. he fell asleep.

The next day, he asked Hlwt for the result. Hlwt said that it scoreda :b in the penalty shootout.

Kennethsnow had some doubt about what Hlwt said becauseHlwt is a fan of Juventus but Kennethsnow loves AC Milan.

So he wanted to know whether the result can be a legal result of a penalty shootout. If it can be, outputYes, otherwise output No.

The rule of penalty shootout is as follows:

  • There will be 5 turns, in each turn, 2 teams each should take a penalty shoot. If goal, the team get 1 point. After each shoot, if the winner can be confirmed(i.e: no matter what happened after this shoot, the winner will not change), the match end immediately.

  • If after 5 turns the 2 teams score the same point. A new turn will be added, until that one team get a point and the other not in a turn.

Before the penalty shootout begins, the chief referee will decide which team will take the shoot first, and afterwards, two teams will take shoot one after the other. Since Kennethsnow fell asleep last night, he had no idea whether AC Milan or Juventus took the first shoot.

Input

The only line contains 2 integers a,b. Means the result that Hlwt said.

0a,b10

Output

Output a string Yes or No, means whether the result is legal.

Sample Input

3 2

2 5

Sample Output

Yes

No

Hint

The Sample 1 is the actual result of the match in 2003.

The Sample 2, when it is 2:4 after 4 turns, AC Milan can score at most 1 point in the next turn. So Juventus has win when it is 2:4. So the result cannot be 2:5.

This story happened in a parallel universe. In this world where we live, kennethsnow is a fan of Real Madrid.

Source

The 13th UESTC Programming Contest Preliminary
//题意:输入a,b;
表示两个人在点球,a,b表示两个人的得分数
现在要求:
进行五局的比赛,没进一个球的一分,没进不得分,如果比赛已经分出胜负了,那么比赛就结束,后面的几轮就不用比了,现在问给定的a,b是否是正确。
//思路:

因为是问是否确定所以要逐个球比较。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
bool work(int a, int b)
{
	if(a == b)
		return false;
	if(a > 5 || b > 5)
	{
		if(abs(a - b) == 1)
			return true;
		else
			return false;
	}
	if(a == 5 || b == 5)
	{
		if(b < 3 || a < 3)
			return false;
		else
			return true;
	}
	if(a == 4 || b == 4)
	{
		if(a == 0 || b == 0)
			return false;
		else
			return true;
	}
	if(a == 3 || b == 3)
	{
		return true;
	}
	return true;
}
int main()
{
	int a, b;
	while(~scanf("%d%d", &a, &b))
	{
		if(work(a, b))
			puts("Yes");
		else
			puts("No");
	}
	return 0;
}

UESTC - 1039

Fabricate equation
Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu

SubmitStatus

Description

Given an integer Y, you need to find the minimal integer K so that there exists a X satisfying X−Y=Z(Z≥0) and the number of different digit between X and Z is K under decimal system.

For example: Y=1, you can find a X=100 so that Z=99 and K is 3 due to 1≠0 and 0≠9. But for minimization, we should let X=1 so that Z=0 and K can just be 1.

Input

Only one integer Y(0≤Y≤1018).

Output

The minimal K.

Sample Input

1

191

Sample Output

1

2

Hint

Source

The 13th UESTC Programming Contest Preliminary
//题意:
给你一个Y,问通过X-Y=Z这个公式可以确定出来的X,Z每个位上的数字进行比较,最少有几个位上的数是不相等的。
//思路:
通过模拟可以发现规律,只有给定的Y中有0(取它本身),9(通过下一位进位)可以使得X和Z在对应位上获得相等的数字,所以每个位上模拟。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
int a[25];
int ans;
void dfs(int cur, int cnt, int tp, int kg)
{
	if(cur >= tp)
	{
		ans = max(ans, cnt);
		return;
	}
	if(a[cur] == 0)
	{
		if(kg != 9 && !(cur == tp - 2 && a[tp - 1] == 9))
			dfs(cur + 1, cnt + 1, tp, 0);
		else 
			dfs(cur + 1, cnt, tp, 1);
	}
	else if(a[cur] == 9)
	{
		if((kg == 1 || kg == 9) && cur != tp - 1 && cur != 0)
			dfs(cur + 1, cnt + 1, tp, 9);
		else
			dfs(cur + 1, cnt, tp, 1);
	}
	else
		dfs(cur + 1, cnt, tp, 1);
}
int main()
{
	LL Y;
	while(~scanf("%lld", &Y))
	{
		int tp = 0;
		while(Y)
		{
			a[tp++] = Y % 10;
			Y /= 10;
		}
		ans = 0;
		dfs(0, 0, tp, 1);
		printf("%d\n", tp - ans);
	}
	return 0;
}
 //这是自己写的模拟的代码,一直WA4。。。,还不懂 
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
char a[20],b[20],s[20],ss[20];
int main()
{
	int i,j;
	while(scanf("%s",ss)!=EOF)
	{
		memset(a,'\0',sizeof(a));
		memset(b,'\0',sizeof(b));
		memset(s,'\0',sizeof(s));
		int len=strlen(ss),k=0;
		for(i=len-1;i>=0;i--)
			s[k++]=ss[i];
		if(s[0]!='0')
			a[0]=s[0]-1;
		else
			a[0]='0';
		
		int l,r;
		for(i=1;i<k-1;)
		{
			if(s[i]!='0')
			{
				a[i]=s[i]-1;
				i++;
			}
			else
			{
				l=i;
				while(s[i]=='0') i++;
				r=i;
				if(r-l<=1)
					a[l]='0';
				else
				{
					a[l]='1';
					for(j=l+1;j<r;j++)
						a[j]='0';
				}			
			}
		}
		a[k-1]=s[k-1]+1;
		ll n=0,m=0,nm;
		for(i=k-1;i>=0;i--)
			n=n*10+(a[i]-'0');
		for(i=0;i<len;i++)
			m=m*10+(ss[i]-'0');
		nm=n-m;
		k=0;
		while(nm)
		{
			b[k++]=nm%10+'0';
			nm/=10;
		}
		for(i=k;i<len;i++)
			b[i]='0';
		int cnt=0;
		for(i=0;i<len;i++)
			if(b[i]!=a[i])
				cnt++;
		if(ss[0]=='9')
			cnt++;
		printf("%d\n",cnt);
	}
	return 0;
}
UESTC - 1041
Hug the princess
Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu

SubmitStatus

Description

There is a sequence with n elements. Assuming they are a1,a2,,an.

Please calculate the following expession.

1i<jn(aiaj)+(ai|aj)+(ai&aj)

In the expression above, ^|& is bit operation. If you don’t know bit operation, you can visit

http://en.wikipedia.org/wiki/Bitwise_operation

to get some useful information.

Input

The first line contains a single integer n, which is the size of the sequence.

The second line contains n integers, the ith integer ai is the ith element of the sequence.

1n100000,0ai100000000

Output

Print the answer in one line.

Sample Input

2
1 2

Sample Output

6

Hint

Because the answer is so large, please use long long instead of int. Correspondingly, please use%lld instead of %d to scanf and printf.

Large input. You may get Time Limit Exceeded if you use “cin” to get the input. So “scanf” is suggested.

Likewise, you are supposed to use “printf” instead of “cout”.

Source

The 13th UESTC Programming Contest Preliminary
//题意:
给你n个数,让求 1i<jn(aiaj)+(ai|aj)+(ai&aj)
//思路:
队友的想法太机智了,先用个二维数组存放每个位上的值的和,然后在每个位进行计算。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 1e5 + 100;
int num[MAXN][35];
int a[35];
int p[MAXN];
typedef long long LL;
int main()
{
	int n;
	while(~scanf("%d", &n))
	{
		int x;
		memset(num, 0, sizeof(num));
		for(int i = 1; i <= n; i++)
		{
			scanf("%d", &x);
			for(int j = 0; j < 33; j++)
			{
				num[i][j] = num[i - 1][j] + x % 2;
				x = x / 2;
			}
		}
		LL ans = 0;
		for(int i = 1; i <= n; i++)
		{
			for(int j = 0; j < 33; j++)
			{
				a[j] = num[i][j] - num[i - 1][j];
			}
			for(int j = 0; j < 33; j++)
			{
				int cnt = 0;
				if(a[j])
				{
					cnt += (i - 1 - num[i - 1][j]);//异或值 
					cnt += i - 1;				   //或值 
					cnt += num[i - 1][j];		   //非值 
				}
				else
				{
					cnt += num[i - 1][j];
					cnt += num[i - 1][j];
				}
				ans += (LL)cnt * (1 << j);//得到对应位上的值后再向右移动对应的位数 
			}
		}
		printf("%lld\n", ans);
	}
	return 0;
}
UESTC - 1045
Lovely princess
Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu

SubmitStatus

Description

There are n jobs you need to complete. However, complete the ith job you capability must be no less than vi. If you have completed the ith job, your capability will increase ai.

Then the question is coming, what is the minimum initial capability value if you are required to complete all of then jobs.

Note that there is no restriction on the order you complete them. That is to say, you can decide the order by your own.

Input

The first line contains a single integer n, which is the number of jobs you need to complete.

Then each of the following n lines contains2 integers vi and ai, which are described above.

1n1000,0vi1000000,0ai1000

Output

Print the answer in one line.

Sample Input

1
2 1

Sample Output

2

Hint

Source

The 13th UESTC Programming Contest Preliminary
//题意:输入n个数,再输入n个a[i],w[i];
给你n个任务,每完成一个一个任务你的能力值会加上对应任务的权值,完成某个任务的要求是,你的能力值要大于这个任务的a[i],问初始的能力值最小是多大?
//思路:
直接模拟。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 1010
using namespace std;
struct zz
{
	int v;
	int w;
}p[N];
bool cmp(zz a,zz b)
{	
	if(a.v==b.v)
		return a.w<b.w;
	return a.v<b.v;
}
int main()
{
	int n,m,i,j,k;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
			scanf("%d%d",&p[i].v,&p[i].w);
		sort(p,p+n,cmp);
		int k=p[0].v,kk=0;
		m=k;
		for(i=1;i<n;i++)
		{
			m+=p[i-1].w;
			if(m<p[i].v)
			{
				kk=p[i].v-m;
				k+=kk;m+=kk;
			}
		}
		printf("%d\n",k);
	}
	return 0;
}




你可能感兴趣的:(周赛题)