Alibaba rekrutiert schriftlichen Test 2020.4.1 (gieriges / exzellentes Team)

[ Alibaba schriftlicher Test 4.1]
Bestätigung : Wahrscheinlich stammt der Titel aus dem Diskussionsbereich von Niuke. Die Eingabe-, Ausgabe- und Datenbereiche des Themas sind ebenfalls etwas unbekannt. Schauen wir uns nur die Ideen an. Diese Details spielen für QAQ keine Rolle. Fehler können gerne korrigiert werden ~

Thema eins (gierig)

Geben Sie eine Zeichenfolge von Binärzeichenfolgen wie 00011001 an. Ich hoffe, dass Sie ihn in alle Nullen ändern können. Wenn Sie ein Zeichen ändern, müssen auch die Zeichen auf beiden Seiten geändert werden. Ändern Sie beispielsweise die zweite Ziffer von 0 in 1, dann wird es 11111001 Finden Sie die minimale Anzahl von Flips. Wenn nicht alle 0 sein können, wird NO ausgegeben.
Idee: Gierig. Es gibt zwei Fälle: Der erste Wert wird geändert / nicht geändert, und dann wird jeder Wert von der vorherigen Zahl beeinflusst. Wenn die letzte Position 1 ist, bedeutet dies, dass die aktuelle Verarbeitung keine Lösung hat. Der Mindestwert von beiden ist ausreichend.

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100010;

char s[maxn],s2[maxn];
int n;
void f(char &c) {
	c = '0'+('1'-c);
}
int cal(char s[]) {
	int res = 0;
	for(int i = 0;i < n-1;++i) {
		if(s[i] == '1') {
			f(s[i]);
			if(i+1 < n) f(s[i+1]);
			if(i+2 < n) f(s[i+2]);
			res++;
		}
	}
	if(s[n-1] == '1') return -1;
	return res;
} 
int main() {
	scanf("%s",s);
	n = strlen(s);
	if(n == 1) {
		int res = s[0]-'0';
		printf("%d\n",res);
		return 0;
	}
	strcpy(s2,s);
	int res = cal(s2);
	if(n > 2) {
		f(s[0]);
		f(s[1]);
//		printf("After :%s\n",s);
		int res2 = cal(s);
		if(res2 != -1) {
			++res2;
			if(res == -1 || res > res2)
				res = res2;
		}
	}
	if(res == -1) puts("NO");
	else printf("%d\n",res);
} 

Thema 2 (Ausgezeichnetes Team)

Es gibt N Monster, M Bögen und Pfeile, jedes Monster hat Gesundheit, jeder Bogen hat Tödlichkeit und Wert, jedes Monster kann nur mit einem Bogen angegriffen werden und der Pfeil tötet> = Monster können Monster zerstören, wenn sie leben, versuchen, Bögen und Pfeile zu benutzen Der kleinste Wert. Wenn es nicht beseitigt werden kann, wird -1 zurückgegeben.
Idee: Exzellentes Team, minimales Haufen.

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100010;
const int maxm = 100010;

int n,m;
int monster[maxn];
struct node {
	int hit;
	int val;
	bool operator <(const node &a) {
		return hit < a.hit;
	}
}arrow[maxm];


int main() {
	scanf("%d%d",&n,&m);
	for(int i = 0;i < n;++i) 
		scanf("%d",&monster[i]);
	for(int i = 0;i < m;++i) 
		scanf("%d%d",&arrow[i].hit,&arrow[i].val);
	sort(monster,monster+n);
	sort(arrow,arrow+m);
	ll ans = 0;
	priority_queue<int,vector<int>,greater<int> > q;
	for(int i = n-1,j = m-1;i >= 0;--i) {
		while(j && arrow[j].hit >= monster[i]) {
			q.push(arrow[j].val);
			j--;
		}
		if(q.empty()) {
			ans = -1;break;
		}
		ans += q.top();
		q.pop();
	}
	printf("%lld\n",ans);
}
Veröffentlicht 152 Originalarbeiten · erntete Lob 2 · Aufrufe 6445

Ich denke du magst

Origin blog.csdn.net/weixin_43918473/article/details/105270908
Empfohlen
Rangfolge