日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4995 (不错的小模拟)

發布時間:2025/6/17 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4995 (不错的小模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 輸入n,m,k ,給你n個點,他們在一個一維坐標上,每個點有兩個值,一個是坐標,另一個是價值,然后有m組操作,每次操作給一個坐標,意思就是把當前這個坐標的點距離他最近的k個點(相等,取id小的)的價值加起來的平均數作為當前的價值,最后輸出所有新得到的權值的和<n,m<=100000 ,k <= min(10 ,n - 1)>.

思路:

? ? ?直接模擬就行了,一開始wa了好多次,被自己坑了,題意明明沒說給的點的坐標是有序的,但是我自己一直認為是有序的所以就各種wa啊wa啊wa,呵呵!我們先把所有的數據按照坐標排序一下,排序之后記得hash下id,然后每次操作直接模擬就行了,具體的看代碼,這個題沒設計到什么想法,最大的時間復雜度是100000 * 10,模擬無壓力 ,不知道為什么寫著感覺挺開心的,雖然題目不難。


#include<stdio.h> #include<algorithm>#define N 110000 using namespace std;typedef struct {double dis ,num;int id; }NODE;NODE node[N]; int hash[N];bool camp(NODE a ,NODE b) {return a.dis < b.dis; }int main () {int t ,n ,m ,k ,i ,a;scanf("%d" ,&t);while(t--){scanf("%d %d %d" ,&n ,&m ,&k);for(i = 1 ;i <= n ;i ++) {scanf("%lf %lf" ,&node[i].dis ,&node[i].num);node[i].id = i;}sort(node + 1 ,node + n + 1 ,camp);for(i = 1 ;i <= n ;i ++)hash[node[i].id] = i; double Ans = 0;while(m--){scanf("%d" ,&a);double sum = 0;int l = hash[a] - 1 ,r = hash[a] + 1;for(i = 1 ;i <= k ;i ++){if(l < 1) sum += node[r].num ,r ++;else if(r > n) sum += node[l].num ,l --;else if(node[hash[a]].dis - node[l].dis == node[r].dis - node[hash[a]].dis) {if(node[l].id < node[r].id) sum += node[l].num ,l--;else sum += node[r].num ,r ++;}else if(node[hash[a]].dis - node[l].dis < node[r].dis - node[hash[a]].dis) sum += node[l].num ,l--;else sum += node[r].num ,r ++;}node[hash[a]].num = sum / k;Ans += node[hash[a]].num;}printf("%.6lf\n" ,Ans);}return 0; }


總結

以上是生活随笔為你收集整理的hdu4995 (不错的小模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。