1. 程式人生 > >配對——我那令人智熄的操作。

配對——我那令人智熄的操作。

include 簡單 -c pre 分享 最終 輸入 技術分享 byte

配對

題目描述:

技術分享

輸入格式:

技術分享

輸出格式:

技術分享

樣例輸入:

3
1 8
2 5
1 2

樣例輸出:

10

提示:

樣例解釋:

如果作業時間8+2配對,5+5配對,最長時間為10;

時間限制:1000ms
空間限制:128MByte

這題是不是看起來很簡單,我剛開始也是這麽覺得的。然後用我那超級無腦的操作來暴力了一下。

#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int n,x,y,a[100000001],num=0,maxn=0;
int main(){
	cin>>n;
	for (int i=1; i<=n; i++){
		cin>>x>>y;
		for (int l=1; l<=x; l++) a[num+l]=y;
		num+=x;
	}
	sort(a+1,a+1+num);
	for (int i=1; i<=num/2; i++){
		if (a[i]+a[num-i+1]>maxn) maxn=a[i]+a[num-i+1];
	}
	cout<<maxn;
	return 0;
}

然後。。用腳毛都可以想得到,爆零了。全都T了。然後我試了很多次。。。

技術分享

最終終於發現Y<=10^9!M<=10^9!。。貌似不可以sort,一sort就會T掉。然後連桶排都不行!因為M<=10^9!然後有了這個想法之後基本上人就傻了。什麽?不能sort?那這個題目怎麽寫?然後就想了超級超級久!之後思路就開始往數學方向越飄越遠,這題用數學方法怎麽做?到了後來寫出來的代碼有多蠢我也就不說了。覺得看一下會更直觀。

#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int n,x,y,a[10000001],sum=0,num=0,maxn=0,mina=1e9;
int main(){
	cin>>n;
	for (int i=1; i<=n; i++){
		cin>>x>>y;
		if (y>maxn) maxn=y;
		if (y<mina) mina=y;
		sum+=x;
		num+=y*x;
	}
//	sort(a+1,a+1+num);
	cout<<ceil(num/(sum/2.0));
	return 0;
}

我還能說什麽??exm?然後一次又一次地看題目,終於又看到了一個條件N<=100000,誒。N好小哦。好像是可以排序的誒。

#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int n,maxn=0;
struct nob{
	int num,value;
}a[100001];;
bool mmp(nob a,nob b){
	return a.value<b.value;
}
int main(){
	cin>>n;
	for (int i=1; i<=n; i++){
		cin>>a[i].num>>a[i].value;
	}
	sort(a+1,a+1+n,mmp);
	int head=1,tail=n;
	while (head<=tail){
		if (a[head].value+a[tail].value>maxn) maxn=a[head].value+a[tail].value;
		int s=min(a[head].num,a[tail].num);
		a[head].num-=s;
		a[tail].num-=s;
		if (a[head].num<=0) head++;
		if (a[tail].num<=0) tail--;
	}
	cout<<maxn;
	return 0;
}

技術分享

我還能說什麽!沒錯,你沒有看錯,此時距離考試開始已經過了兩個小時。我居然花了兩個小時在一個簽到題上面!再見了,這個色彩斑斕的世界,再見了,這片天空。我日!我只能仰天長嘯一句mmp。令人智熄的操作*1。

配對——我那令人智熄的操作。