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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

nyoj543遥控器

發布時間:2025/3/16 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj543遥控器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:nyoj543遙控器? 或者nsoj5138遙控器

題目描述與生活中使用遙控器的境況基本一致,此處不再累述。

我的思路:
從x頻道轉到y頻道有兩種方法,取兩者按鍵次數少者


轉頻道方法1、

直接按up鍵、down鍵(前提是該鍵可用),此時需比較從x頻道到y頻道按up與down按鍵次數。比如x = 1,y = 98這種情況顯然就是按down時次數少。


轉頻道方法2、

x頻道先跳轉到中間頻道z,再up鍵、down鍵到y頻道(把x跳到y的情況看成z==y),當然跳轉需要 _鍵 及數字鍵有用,跳轉到小于10的頻道無需判斷 _鍵(題目已知)。跳轉時按鍵次數+up或down次數即為總按鍵次數。
先執行方法1,再從0~99循環方法2(即把0~99頻道當成z),得出最小值即為所求。

改進:
發現每次都循環0~99顯然是沒必要的,比如x=23,y=52,先由方法1得到按鍵次數min(此處為29)
我們只需循環52-(min:29-3)~~52+(min:29-3) 即26~~78=52次即可,其中3是此處跳轉到z時需要按鍵的次數,由于z<10時為1,為了簡化問題復雜性干脆不減,即
y-min循環到y+min。循環需要一個輔助數組,比如當x=29, y=1時,min=28, 此時循環就是從73到29,注意是73->99->0->29的循環,故需要一個輔助數組維持循環。

代碼如下:

#include <stdio.h> #define INF 100//表示不可到達 int ctrl[15]; int getDif(int i, int j) {//從i頻道up down到j所需次數 int dif = INF;if (j > i) {if (ctrl[10]) dif = j-i;if (ctrl[11] && dif > 50) dif = i+100-j;} else if (j < i) {if (ctrl[11]) dif = i-j;if (ctrl[10] && dif > 50) dif = j+100-i;} else return 0;return dif; } int main() {int T, n[333], i, j;//初始化輔助數組 for (i = 0; i < 301; i++) n[i] = i%100;scanf("%d", &T);while(T--) {int min = INF, count;//ctrl數組存遙控器 for (i = 0; i < 3; i++) {for (j = 1; j < 4; j++) scanf("%d", &ctrl[i*3+j]);scanf("%d", &ctrl[10+i]);}scanf("%d", &ctrl[0]);//其中0-9為數字0-9,10為up,11為down,12為_//按此格式輸人方便后續操作 scanf("%d%d", &i, &j);//i 跳轉到 jmin = getDif(i,j);//直接up down int m = j+101+min;i = j+100-min;//循環的開始與結尾 if (min == INF) {//min == INF說明up down不可用 m = j+101;i = j+100;//故調整m,i使循環中只判斷能否直接跳轉到j }for (i; i < m; i++) {int k = n[i];count = 0;if (k < 10) {//中轉頻道<10時 if (ctrl[k]) {//若該鍵有用 count++;count += getDif(k, j);//中轉頻道再up down } else count = INF;//該鍵無用} else {if (ctrl[12]) {//_鍵有用 count++;int q = k;while (q) {if (ctrl[q%10]) count++;else count += INF;q /= 10;}count += getDif(k, j);} else count = INF;}if (count < min) min = count;}if (min >= 100) printf("-1\n");else printf("%d\n", min);}return 0; }

總結

以上是生活随笔為你收集整理的nyoj543遥控器的全部內容,希望文章能夠幫你解決所遇到的問題。

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