URAL 2092 Bolero 暴力列舉

2021-07-15 17:55:24 字數 2195 閱讀 5010

就是說,有個人他要買n張票,每張有各自的**,然後由於他是學生,所以每張它也可以有對應的折扣

然後這個售票的也在做活動,有m種,每種可以表示為你一次買》=x張時,可以給你y的折扣(少付y%)

但是他只能選擇一種折扣,然後剩下的單獨去買

然後這個題,唉,上來一看資料範圍,n和m都是10^5,然後就想貪心(其實是暴力),後來想了想對於m種活動,其實折扣的區間只有[1,100],對於每種折扣相同的,肯定保留最小的那個x就行

,所以其實只要100種折扣

然後就去貪了,然後就wa了,然後還蜜汁證了一下貪心,感覺自己沒錯(當然是當時證明出錯了),然後就卡住了

然後最後其實是暴力列舉,先把所有的票優先按折扣公升序排序,折扣相同按**降序排序

然後列舉優惠活動,對於每乙個,它所要求的那個x和給的折扣y,就先看看所有折扣<=y的有多少個,

假如有k個,k>=x的話,肯定就把前x個給用優惠活動買了就行,剩下的單獨去買

如果k然後最後就得到答案了

(後來想了乙個更暴力的方法,就是對於每種優惠方案,都去找每個的差值(計正負),然後直接排序,選取最前面的那些,然後t了,算了一下複雜度是100*100000*log100000,果然太大了,不過也算一種思路吧

#include #include #include #include #include #include #include #include using namespace std;

#define ll long long

#define eps 1e-6

#define maxn 100005

struct node

;bool cmp(node &a, node &b)

node a[maxn];

int b[105];

int n, m;

ll suffix[maxn];

ll sum[maxn];

ll differ[maxn];

int main()

int s, k, p;

ll t = 0;

for (int i = 0; i < m; ++i)

sort(a, a + n, cmp);

suffix[n] = 0; sum[0] = 0;

for (int i = n - 1; i >= 0; --i)

for (int i = 1; i <= n; ++i)//表示[0,i)的**和

/*for (int i = 0; i <= n; ++i)

printf("%d ", sum[i]);

printf("\n");

for (int i = 0; i <= n; ++i)

printf("%d ", suffix[i]);

printf("\n");*/

ll ans = suffix[0];

int lastpos = 0;

for (int i = 1; i <= 100; ++i)

//printf("add %lld %lld\n", sum[s] - sum[s] / 100 * i, suffix[s]);

//printf("1discount %d num %d sum %lld\n", i, j, t);

}else

/*for (int k = 0; k < n - j; ++k)

printf("%lld ", differ[k]);

printf("\n");*/

sort(differ, differ + n - j);

t = 0;

for (int k = 0; k < s - j; ++k)

t += differ[k];

//printf("add %lld %lld %lld\n", sum[j] - sum[j] / 100 * i, suffix[j], t);

t = sum[j] - sum[j] / 100 * i + suffix[j] + t;

if ( t < ans)

//printf("2discount %d num %d sum %lld\n", i, j, t);

}lastpos = j;

break;

}} }

printf("%f\n", ans*0.01);

//while (1);

return 0;

}

209 單詞規律2020 12 16

給定一種規律 pattern 和乙個字串 str 判斷 str 是否遵循相同的規律。這裡的 遵循 指完全匹配,例如,pattern 裡的每個字母和字串 str 中的每個非空單詞之間存在著雙向連線的對應規律。例項 輸入 pattern abba str dog cat cat dog 輸出 true輸...

URAL1297 字尾陣列

題目意思 給你乙個字串,要你求出最長的回文子串 解題思路 把原串的反串加個原串後面,中間加個沒有出現過的字元 然後,原串中,下標i在反串中對應的位置為2 l i 如果求以i為對稱軸的回文串,我們求suffix i 和suffix 2 l i 的lcp 如果求以i和i 1為對稱軸的回文串,我們求suf...

ural1517字尾陣列

題意 求兩串字元 0 255 的最長公共字串 思路 先將兩個字元鏈結起來,中間用乙個不曾出現過的字元,然後直接求出height陣列,然後根據它的特性,求出最長的公共字串,當然這個最長公共字串的座標要符合乙個在第乙個串中,另乙個在另一串中.這個好處理,直接根據sa陣列特性,sa i 1 sa i 可知...