【賽時總結】 ◇賽時·II◇ AtCoder ABC-100

◆賽時·II◆ ABC-100


■嘮叨■

ABC終於超過百場比賽啦(堅決果斷地參加)。而後莫名其妙的好像是人不少,評測慢得不可理喻。而後我就……交了一大發……錯誤程序……而後B題就沒了。最後的D題竟然是貪心(題意沒看懂),我就作了個DP還wa了 (;′⌒`)app


■試題&解析■

◆潑水節◆ A-Happy Birthday!

  • 【Atcoder ABC-100 A】
  • 【翻譯】 E869120和square1001的16歲生日到了,來自Atcoder王國的Takahashi送給他們一個被平均切成16份的蛋糕,E869120和square1001分別要吃A、B份蛋糕(A+B≤16),可是一張紙條上寫着「同一我的不能吃相鄰的2塊蛋糕」,請問他們可否按照規定分出蛋糕,是輸出"Yay!",不然輸出":("。
  • 【解析】 由於題目說不能同一我的拿相同的兩塊,因此咱們能夠算出一我的最多能夠拿幾塊,就像下面這樣: 圖片 可見這是2我的都拿到本身的最大份數——各8份,也就是說每一個人最多吃八份。因此判斷A和B是否都小於8就能夠了。
  • 【源代碼】
/*Lucky_Glass*/
#include<cstdio>
int main()
{
	int A,B;scanf("%d%d",&A,&B);
	printf("%s",(A<=8 && B<=8)? "Yay!":":(");
	return 0;
}

◆此題有詐◆ B-Ringo's Favorite Numbers

  • 【Atcoder ABC-100 B】
  • 【翻譯】 今天,ABC-100舉行了。在這種狀況下,Takahashi想要給Ringo一個整數。由於ABC-100這個名字,Ringo將會很高興,若是他獲得一個能剛好被100整除D次的整數。求出讓Ringo高興的第N小的整數。
  • 【解析】 也就是求出第N小的數X,使得X=100^D*k,且k不能被100整除(這也就是「剛好」的含義)。我在這個地方栽了3次(網卡,把錯誤代碼交了3次╮(╯﹏╰)╭),最後發現了。其實很容易判斷這個數的末尾應該是有(2*D)個0的,關鍵是前面,咱們容易發現前面是和N有關係的。大多數時候,前面的數就是N,可是這裏的N知足1≤N≤100,因此惟一有N爲100時須要特判——由於若是是前面的數爲N,那麼該數就是 100^(D+1) 了,不知足「剛好」的要求(好比D=一、N=100時,答案應該是10100)。
  • 【源代碼】
/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
	int D,N;scanf("%d%d",&D,&N);
	if(N==100) printf("101");
	else printf("%d",N);
	for(int i=0;i<D;i++)
		printf("00");
	return 0;
}

*◆大千世界◆ C-3 or /2

  • 【Atocder ABC-100 C】
  • 【翻譯】 ABC-100舉行了,AtCoder的辦公室被用一個長度爲N的序列a{a1,a2,a3……aN}裝扮起來了。一個職員Snuke想要玩一玩這個序列。特別的,他喜歡重複執行下面的兩個操做越多越好: ①對於a的每個元素,選擇把它除以2或者乘以3;②不能夠對a的每個元素都執行「乘以3」,且操做後a的元素必須都爲整數。 請問他最多能夠進行幾輪操做(對a中的每一個元素都完成一次操做叫一輪操做)。
  • 【解析】 因爲輸入的是整數,且要求操做後爲整數,「/2」的操做是受限的,被操做數必須是2的倍數,可是「*3」相對而言,只要還能夠進行「/2」的操做就能夠一直進行。又由於是「*3」,3和2互質,只要一個數不能被2整除,它在以後的操做中就不可能變爲2的倍數。因而可知,操做次數是取決於「/2」的操做次數的。在這裏,咱們有最優的方法——每次只選取一個能夠執行「/2」操做的數進行「/2」,其他數都「*3」,由於「/2」受限,「*3」不受限!那麼一個數N把它分解成 N=k*2^m (k爲奇數),那麼該數能夠進行m次「/2」操做。對於a的每個數都求出對應的m,求和就能夠了。
  • 【源代碼】
/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=10000;
int main()
{
	int n,ans=0;scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		int X;scanf("%d",&X);
		while(X%2==0)//k不爲奇數
			X/=2,ans++;//求m
	}
	printf("%d\n",ans);
	return 0;
}

◆無奇不有◆ D-Patisserie ABC

  • 【Atcoder ABC-100 D】
  • 【翻譯】 Takahashi成爲了一名糕點師並開了一家商店「La Confiserie d'ABC」來慶祝ABC-100. 這家店輸出N種蛋糕,第i種蛋糕有外觀值xi、味道值yi、熱度值zi(-10^10≤x,y,z≤10^10),Ringo覺定選M種蛋糕(不重複選同一種),使得 |x的和|+|y的和|+|z的和| 最大("||"爲絕對值)。求出這個最大值。
  • 【解析】 提到絕對值最大就很容易想到極正和極負,因此咱們能夠事先決定x、y、z的和分別的正負性分別爲i,j,k(i,j,k爲1或-1),而後就能夠直接暴力求它爲答案做出的貢獻-i*x+j*y+k*z,按照貢獻來從大到小sort一次,此時的前M個元素就是對答案貢獻最大的前M個蛋糕,就選擇這M個。再根據這個求出此時的值,一共2^3種狀況,取最大值就行了。
  • 【源代碼】
/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=1000;
int n,m;
typedef long long ll;
struct CAKE
{
	ll A,B,C;
}cak[MAXN+5];
int i,j,k;
bool cmp(CAKE a,CAKE b)
{
	return a.A*i+a.B*j+a.C*k>b.A*i+b.B*j+b.C*k;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld%lld%lld",&cak[i].A,&cak[i].B,&cak[i].C);
	ll ans=0;
	for(i=-1;i<=1;i+=2)
		for(j=-1;j<=1;j+=2)
			for(k=-1;k<=1;k+=2)
			{
				sort(cak+1,cak+n+1,cmp);
				ll tot[3]={};
				for(int p=1;p<=m;p++)
					tot[0]+=cak[p].A,tot[1]+=cak[p].B,tot[2]+=cak[p].C;
				ans=max(ans,tot[0]*i+tot[1]*j+tot[2]*k);
			}
	printf("%lld\n",ans);
	return 0;
}
//fantastic atcoder! wonderful ABC!!!

The End

Thanks for reading!

- Lucky_Glass (。・ω・。)spa

相關文章
相關標籤/搜索