西安郵電大學ThoughtWorks®聯合創新實驗室第一次組內排位賽題解

Wraith.發表於2020-11-29

A-HDU 2097

題述


Sky從小喜歡奇特的東西,而且天生對數字特別敏感,一次偶然的機會,他發現了一個有趣的四位數2992,這個數,它的十進位制數表示,其四位數字之和為2+9+9+2=22,它的十六進位制數BB0,其四位數字之和也為22,同時它的十二進位制數表示1894,其四位數字之和也為22,啊哈,真是巧啊。Sky非常喜歡這種四位數,由於他的發現,所以這裡我們命名其為Sky數。但是要判斷這樣的數還是有點麻煩啊,那麼現在請你幫忙來判斷任何一個十進位制的四位數,是不是Sky數吧。

輸入


輸入含有一些四位正整數,如果為0,則輸入結束。

輸出


若n為Sky數,則輸出“#n is a Sky Number.”,否則輸出“#n is not a Sky Number.”。每個結果佔一行。注意:#n表示所讀入的n值。

樣例


輸入

2992
1234
0

輸出

2992 is a Sky Number.
1234 is not a Sky Number.

B-HDU 2098

題述
把一個偶數拆成兩個不同素數的和,有幾種拆法呢?


輸入
輸入包含一些正的偶數,其值不會超過10000,個數不會超過500,若遇0,則結束。


輸出
對應每個偶數,輸出其拆成不同素數的個數,每個結果佔一行。


樣例


輸入

30
26
0

輸出

3
2

C-HDU 6702

題述
現在我們有兩個正整數A和B,請找出一個正整數C,使得式子( (A xor C)&(B xor C) )最小 (xor是異或運算)
當然,如果使得式子最小的C為0時,請你輸出1


輸入
第一行輸入T,代表有T組資料
接下來每一行輸入兩個數A,B(A,B<=2^32)


輸出
對於每一組資料輸出一個正整數C


樣例


輸入

1
3 5

輸出

1

D-計蒜客 30990

題述
我們描述 K:

k! = 1 * 2 * …* (k - 1) *k

我們表示 S:

S = 1 * 1! + 2 * 2! + … +
(n - 1) * (n-1)!

然後 S 對 n 去模是 ___________

你將得到一個整數n.

你需要計算 S 對 n 取模的值


輸入
第一行輸入一個整數 T(T < 1000), 表示測試用例的行數.

對於每個測試用例,都有一行包含一個整數 n.


輸出
對於每個測試用例,列印一個整數 S 對 n 取模後的值.


提示

第一個測試用例 S = 1* 1!= 1, 並且 1 的模 2 運算 1.

第二個測試用例 S = 11!+2 2!= 5 , 並且 5 對 3 取模是 2.

樣例


輸入

2
2
3

輸出

1
2

E-HDU 2040

題述
古希臘數學家畢達哥拉斯在自然數研究中發現,220的所有真約數(即不是自身的約數)之和為:

1+2+4+5+10+11+20+22+44+55+110=284。

而284的所有真約數為1、2、4、71、 142,加起來恰好為220。人們對這樣的數感到很驚奇,並稱之為親和數。一般地講,如果兩個數中任何一個數都是另一個數的真約數之和,則這兩個數就是親和數。

你的任務就編寫一個程式,判斷給定的兩個數是否是親和數


輸入
輸入資料第一行包含一個數M,接下有M行,每行一個例項,包含兩個整數A,B; 其中 0 <= A,B <= 600000 ;


輸出
對於每個測試例項,如果A和B是親和數的話輸出YES,否則輸出NO。


樣例


輸入

2
220 284
100 200

輸出

YES
NO

F-HDU 1846

題述
十年前讀大學的時候,中國每年都要從國外引進一些電影大片,其中有一部電影就叫《勇敢者的遊戲》(英文名稱:Zathura),一直到現在,我依然對於電影中的部分電腦特技印象深刻。
今天,大家選擇上機考試,就是一種勇敢(brave)的選擇;這個短學期,我們講的是博弈(game)專題;所以,大家現在玩的也是“勇敢者的遊戲”,這也是我命名這個題目的原因。
當然,除了“勇敢”,我還希望看到“誠信”,無論考試成績如何,希望看到的都是一個真實的結果,我也相信大家一定能做到的~

各位勇敢者要玩的第一個遊戲是什麼呢?很簡單,它是這樣定義的:
1、 本遊戲是一個二人遊戲;
2、 有一堆石子一共有n個;
3、 兩人輪流進行;
4、 每走一步可以取走1…m個石子;
5、 最先取光石子的一方為勝;

如果遊戲的雙方使用的都是最優策略,請輸出哪個人能贏。


輸入
輸入資料首先包含一個正整數C(C<=100),表示有C組測試資料。
每組測試資料佔一行,包含兩個整數n和m(1<=n,m<=1000),n和m的含義見題目描述。


輸出
如果先走的人能贏,請輸出“first”,否則請輸出“second”,每個例項的輸出佔一行。


樣例


輸入

2
23 2
4 3

輸出

first
second

G-HDU 2084

題述
在講述DP演算法的時候,一個經典的例子就是數塔問題,它是這樣描述的:
在這裡插入圖片描述

有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?

已經告訴你了,這是個DP的題目,你能AC嗎?


輸入
輸入資料首先包括一個整數C,表示測試例項的個數,每個測試例項的第一行是一個整數N(1 <= N <= 100),表示數塔的高度,接下來用N行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。


輸出
對於每個測試例項,輸出可能得到的最大和,每個例項的輸出佔一行。


樣例


輸入

1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

輸出

30

H-CodeForces 1430A

題述
熊熊是一名csgo玩家,在沙二馳騁多年的他,顯然已經對這個地方瞭如指掌。他恐怖的定位和風騷的身法以及高超的戰術讓他的隊友後悔來到這個地方。尤其是他的大狙,當他扛著笨重的awp走到中門時,每一聲槍響都會有人應聲倒地。但是熊熊有個奇怪的癖好,他每一次只殺奇數個數的人,一殺他嫌太少,九殺又太多,所以他每一局他只會打出三殺,五殺或七殺。現在你在他旁邊看他打遊戲,你看到他殺了n個人,你現在想知道他分別打出了多少個三殺,五殺或七殺。


輸入
第一行的整數 t(1<=t<=1000)— 測試用例的個數.

每個測試用例只有一個輸入資料 — lrh殺人的總數 n(1<=n<=1000)


輸出
如果對於某個測試樣例,沒有正確的答案,則輸出 -1.

否則,輸出3個正整數-三殺的個數,五殺的個數,七殺的個數 — 如果存在多個情況,輸出任意一種即可


樣例


輸入

4
30
67
4
14

輸出

2 2 2
7 5 3
-1
0 0 2

I-CodeForces 1430B

題述
你有 n個 桶放在一排 , 從左到右開始編號分別為1~n. 最初, 第 i 桶裝的水是 ai 升.

你可以把水從一個桶倒到另一個桶。 在這個過程中, 你可以兩個選擇兩個桶 x 和y (第 x個桶不應該為空) 然後從桶x 向桶 y 倒水(可能是所有的水).你可以假設桶的容量是無限的,所以你可以在每個桶裡倒入任何數量的水。

如果最多可以倒水 k 次.計算桶中最大和最小水量之間的最大可能差。

舉例

  • 如果你有四個桶,每個桶裡裝5升水,k=1,你可以從第二個桶裡倒5升水到第四個桶裡,所以桶裡的水量是[5,0,5,10],最大和最小的差值是10;
  • 如果所有的桶都是空的,你就不能做任何操作,所以最大和最小的量之差仍然是0。

輸入
第一行包含一個整數 t (1 < t < 1000) — 測試用例的數量

每個測試用例的第一行包含兩個整數 n 和 k(1 <= k < n < 2<= 10^5) — 桶數和可以澆注的數量。

第二行包含 n 整數 a1, a2, … an (0 <=ai <=10^9), 其中ai 是第 i 個桶的初始水量。

保證 n 個以上測試用例的總和不超過 2 * 10^5.


輸出
F對於每個測試用例,如果最多可以倒水k 次,請列印桶中最大和最小水量之間的最大可能差值。


樣例


輸入

2
4 1
5 5 5 5
3 2
0 0 0

輸出

10
0

J-CodeForces 1430C

題述
「融合」是《遊戲王》集換式卡牌遊戲中的一張通常魔法卡,是最早對融合怪獸進行融合召喚的魔法卡,也是進行融合召喚的泛用魔法卡。

​ 現在zwt也想練習一下融合,他的目標轉向了陣列

​ 每次zwt可以選擇兩個不同的數字,並且大喊一聲“フュージョン!!!”,然後這兩個數字就會融合,變成他們和的一半(向上取整)放到陣列裡

​ 現在有一個序列1,2,3,4,………,n,zwt想知道他要施法幾次,每一步選擇哪幾個數字,這個陣列才能變成一個數,並且使得這個最後留下的數字最小

​ 如n=4,

​ 1.選擇a=2,b=3,陣列變為[1,3,3]

​ 2.選擇a=3,b=3,陣列變為[1,3]

​ 3.選擇a=1,b=3,陣列變為[2]

​ 如果有多種方案,輸出任意一種


輸入
第一行輸入位t[1,1000],表示有t組資料

每組資料的第一行為n[2,200000]

n的總和不會超過200000


輸出
對於每組資料輸出最後留下的最小的那個數字
之後n-1行依次輸出步驟


樣例


輸入

1
4

輸出

2
2 4
3 3
3 1

題解

A
思想:主要考慮進位制轉換問題,十進位制轉是二進位制,十進位制轉十六進位制。與二進位制大同小異,不斷做除法並取餘。程式碼如下:

#include <stdio.h>
int main(void)
{
	int a[3],b[3];
	int i,sum,m,n;
	a[0]=10;
	a[1]=12;
	a[2]=16;
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)
			break;
		for(i=0;i<3;i++)
		{
			m=n,sum=0;
			while(m!=0)
			{
				sum+=m%a[i];
				m/=a[i];
			}
			b[i]=sum;
		}
		if(b[1]==b[0]&&b[1]==b[2])
			printf("%d is a Sky Number.\n",n);
		else
			printf("%d is not a Sky Number.\n",n);
	}
	return 0;
} 

B
思想:利用素數篩法,有不懂的可以去這個部落格素數篩法(素篩)學習一下,總結的很到位了。

#include <stdio.h>
#include <math.h>
void sieveofe(int p[], int n)
{
    int i, j;
 	p[0] = 0;
    p[1] = 0;
    p[2] = 1;
    for(i=3; i<=n; i++) 
	{
        p[i++] = 1;
        p[i] = 0;
    }
    int max = sqrt(n);
    for(i=3; i<=max; i++){
        if(p[i]) {
            for(j=i+i; j < n; j+=i
                p[j]=0;
        }
    }
}
#define MAX 10000
int main(void)
{
    int p[MAX+1];
    int sum, count, i;
 
    sieveofe(p, MAX);
 
    for(;;) {
        scanf("%d", &sum);
        if(sum == 0)
            break;
 
        count = 0;
        for(i=2; i<=sum / 2; i++) {
            if(p[i] && p[sum-i])
                if(i != sum-i)
                    count++;
        }
 
        printf("%d\n", count);
    }
 
    return 0;
}

程式碼出處HDU2098 分拆素數和【篩選法】
C
思想:
在這裡插入圖片描述
看上圖真值表。

#include <stdio.h>
int main(void)
{
	long long int a,b,c,t;
	scanf("%lld", &t);
	while(t--)
	{
		scanf("%lld%lld", &a, &b);
		if((a&b)==0)
			printf("1\n");
		else
			printf("%lld\n", a&b);		
	}
	return 0;
}

D
思想:看樣例!!看樣例!!找規律!!
Tips:數值減一。
E
思想:暴力法,依次求他們的約束,看是否相等。

#include <stdio.h>
int main(void)
{
	int	M;
	while(scanf("%d",&M)!=EOF)
	{
		for(int i=0;i<M;i++)
		{
			int A,B,j,k,sum=0,num=0;
				scanf("%d%d",&A,&B);
			for(j=1;j<A;j++)
			{
				if((A%j)==0)
					sum+=j;
				else
					continue;
			}
			for(k=1;k<B;k++)
			{
				if((B%k)==0)
					num+=k;
				else
					continue;
			}
			if(num==A&&sum==B)
				printf("YES\n");
			else
				printf("NO\n");
			}
	}
	return 0;
}        

F
思想:經典巴什博弈:
最多取m個,如果剩下m+1個是不是無論第一個人如何取,後手都能一次取完也就是說:無論他們前邊如何拿如果n=(m+1)r+s(換句話說就是當先手拿走s個時,後手總能保證剩下的為m+1的整數倍,則後手必勝,否則先手必勝)
例如:先手拿走s個,後手拿走k個保證剩下的是(m+1)的整數倍,則後手必勝,如果先手拿走s個使得剩下的為(m+1)的整數倍,則先手必勝
結論:n % (m+1) == 0,後手必勝;否則先手必勝。

#include<stdio.h>
int main(void{
    int c,n,m;
	scanf("%d",&c);
	while(c--)
	{
	   scanf("%d%d",&n,&m);
	   if(n%(m+1)==0) 
	   		printf("second\n");
       else 
       		printf("first\n");	
	}
	return 0;
}

G
思想:DP演算法,區域性優化。從最下層,兩兩取最大。

#include<stdio.h>
int max(int a,int b)
{
	int t;
	if(a>b)
	{	t=a;
		a=b;
		b=t;
		return t;
	}
	else
		return b;
}
int main(void)
{
	int a[101][101];
	int c;
		scanf("%d",&c);
	while(c--)
	{
		int n;
		int i,j;
			scanf("%d",&n);
		for(i=0;i<n;i++)
		{
			for(j=0;j<=i;j++)
				scanf("%d",&a[i][j]);
		}
		for(i=n-2;i>=0;i--)
		{
			for(j=0;j<=i;j++)
			{
				a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
			}
		}
		printf("%d\n",a[0][0]);
	}
	return 0;
}

H
思想:暴力求解

# include<stdio.h>
int main()
{
	int n=0,m=0,i=0,j=0,k=0;
	scanf("%d",&m);
	while(m--)
	{  scanf("%d",&n);
	  int flag=0;
		for( i=0;i<n;i++)
		 {
		 for(j=0;j<n;j++)
		  {
		    for( k=0;k<n;k++)
		    {
		    	if(3*i+5*j+7*k==n)
		    	{
		    		flag=1;
		    		break;
		    	}
				  } 
				  if(flag==1)
				  break;
		        	} if(flag==1)
				  break;  
				    }
			if(flag==0)
			printf("%d\n",-1);
			else
			printf("%d %d %d\n",i,j,k);
			
		}
			return 0;
}

I
思想:給水的多少排序,每次把第二多的加到最多的裡面。最後得出最多的。

#include<stdio.h>
#include<algorithm>
using namespace std;
int main(void)
{
	int t,i;
		scanf("%d",&t);
	for(i=0;i<t;i++)
	{
		int n,k,j,l,a[1100],t,sum=0;
			scanf("%d%d",&n,&k);
		for(j=1;j<=n;j++)
		{
			scanf("%d",&a[j]);
		
		}
			sort(a+1,a+n+1);
				while(k!=0)
				{
					a[n]+=a[n-k];
					k--;
				}
				printf("%d\n",a[n]);
	}
	return 0;
}

J
思想:明確你不論如何操作最小值都會是2,其實每次去哪兩個都可以,但是官方題解是每次取最大的兩個,可能他想貪心一下

#include<stdio.h>
int main(void)
{
	int t;
		scanf("%d",&t);
	while(t--)
	{
		int n;
			scanf("%d",&n);
		printf("2\n");
		printf("%d %d\n",n-1,n);
		for(int i=n-2;i>=1;--i)
			printf("%d %d\n",i,i+2);
	}
	return 0;
}

相關文章