https://paiza.jp/poh/ec-campaign
新人女子プログラマとかエナジードリンクとかよくわからないことが書いてあるので、無視して下にスクロールすると問題があります。
最初のattemptはTLE。
► スポイラーを表示
#include
#include
#define N_MAX 500000
int N;
int price[N_MAX];
int cmpInt(const void* x,const void* y) {
int a=*((const int*)x);
int b=*((const int*)y);
if(a>b)return 1;
if(a=0;j--) {
if(campaignPrice-price[j]>price[j])break;
maxIndex2=getUpperBound(campaignPrice-price[j]);
if(maxIndex2==maxIndex1)maxIndex2--;
if(maxIndex2>=0) {
int nowPrice=price[j]+price[maxIndex2];
if(nowPrice>maxPrice)maxPrice=nowPrice;
}
}
printf("%d\n",maxPrice);
}
return 0;
}
2度目のattemptでAC。(Test case 3 : 0.28秒)
► スポイラーを表示
#include
#include
#define N_MAX 500000
int N;
int price[N_MAX];
int cmpInt(const void* x,const void* y) {
int a=*((const int*)x);
int b=*((const int*)y);
if(a>b)return 1;
if(a=0;j--) {
if(campaignPrice-price[j]>price[j])break;
maxIndex2=getUpperBound(campaignPrice-price[j],j);
if(maxIndex2>=0) {
int nowPrice=price[j]+price[maxIndex2];
if(nowPrice>maxPrice) {
maxPrice=nowPrice;
if(maxPrice==campaignPrice)break;
}
}
}
printf("%d\n",maxPrice);
}
return 0;
}
4度目のattempt (Test case 3 : 0.11秒)
► スポイラーを表示
#include
#define N_MAX 500000
#define PRICE_MAX 1000000
int N;
int price[N_MAX];
int priceCount[PRICE_MAX+1];
int getUpperBound(int max,int searchMax) {
int left,right,mid;
left=0;right=searchMax-1;
while(leftpmax)pmax=nowPrice;
}
priceCountPtr=&priceCount[pmin];
for(i=pmin;i=1) {
*(pricePtr++)=i;
if(*priceCountPtr>=2)*(pricePtr++)=i;
}
priceCountPtr++;
}
N=(int)(pricePtr-price);
for(i=0;i0;j--) {
if(price[j]+price[j-1]=0) {
int nowPrice=price[j]+price[maxIndex2];
if(nowPrice>maxPrice) {
maxPrice=nowPrice;
if(maxPrice==campaignPrice)break;
}
}
}
printf("%d\n",maxPrice);
}
return 0;
}
6度目のattempt (Test case 3 : 0.07秒)
► スポイラーを表示
#include
#include
#define N_MAX 500000
#define PRICE_MAX 1000000
int price[507904]; /* minimum integer which is N_MAX or more */
int priceCount[1007616]; /* minimum integer which is PRICE_MAX+1 or more */
int N;
int getUpperBound(int max,int searchMax) {
int left,right,mid;
left=0;right=searchMax-1;
while(left=1) {
*(pricePtr++)=i;
if(*priceCountPtr>=2)*(pricePtr++)=i;
}
priceCountPtr++;
}
N=(int)(pricePtr-price);
for(i=0;i0;j--) {
if(price[j]+price[j-1]=0) {
int nowPrice=price[j]+price[maxIndex2];
if(nowPrice>maxPrice) {
maxPrice=nowPrice;
if(maxPrice==campaignPrice)break;
}
}
}
printf("%d\n",maxPrice);
}
return 0;
}
18回目のattempt (Test case 3 : 0.04秒)
► スポイラーを表示
#include
#include
#define N_MAX 500000
#define PRICE_MAX 1000000
int price[507904];
int priceCount[1015808];
int N;
int myatoi(const char* s) {
int ret=0;
for(;*s!='\n' && *s!='\0';s++)ret=ret*10+*s-'0';
return ret;
}
int getUpperBound(int max,int searchMax) {
int left,right,mid;
left=0;right=searchMax-1;
while(left>1;
if(price[mid]=1) {
*(pricePtr++)=i;
if(*priceCountPtr>=2)*(pricePtr++)=i;
}
priceCountPtr++;
}
N=(int)(pricePtr-price);
for(i=0;imaxPrice) {
maxPrice=nowPrice;
if(maxPrice==campaignPrice)break;
}
b--;
if(a==b)break;
limit=campaignPrice-price[b];
if(limit
#include
#define N_MAX 500000
#define PRICE_MAX 1000000
int price[507904];
int priceCount[1015808];
char inputBuf[4063232];
int N;
int getUpperBound(int max) {
int left,right,mid;
left=0;right=N-1;
while(left>1;
if(price[mid]='0')ret=ret*10+*(p++)-'0';
priceCount[ret]++;
}
priceCountPtr=&priceCount[0];
for(i=0;i='0')campaignPrice=campaignPrice*10+*(p++)-'0';
if(N=b) {
maxPrice=price[b-1]-price[b];
} else {
for(;;) {
int nowPrice=price[a]+price[b];
if(nowPrice>maxPrice) {
maxPrice=nowPrice;
if(maxPrice==campaignPrice)break;
}
b--;
if(a==b)break;
a=getUpperBound(campaignPrice-price[b]);
if(a>=b)a=b-1;
}
}
while(maxPrice>0) {
*(op--)=maxPrice%10+'0';
maxPrice/=10;
}
puts(op+1);
}
}
return 0;
}
というわけで、
► スポイラーを表示
アルゴリズムの定数倍高速化ゲーかと思った?残念!入力の定数倍高速化ゲーでした!
0.11秒
→printfとか多機能だし遅そう!fgetsしてatoiしよう! 0.07秒
→atoiは機能がシンプルだし速そうだと思ったら、strtolに丸投げしてた!自前で整数に変換しよう! 0.04秒
→よく考えたらfgetsってなんかLOCKとかしてて遅そうだし、関数呼び出しも遅いよね!最初に一気に読み込もう! 0.01秒
0.11秒
→printfとか多機能だし遅そう!fgetsしてatoiしよう! 0.07秒
→atoiは機能がシンプルだし速そうだと思ったら、strtolに丸投げしてた!自前で整数に変換しよう! 0.04秒
→よく考えたらfgetsってなんかLOCKとかしてて遅そうだし、関数呼び出しも遅いよね!最初に一気に読み込もう! 0.01秒
※まだバグが治っていないのですね。コード中に'が出てきたら、'に読み替えてください。
みなさんも、是非挑戦してみたらいかがですか?