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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

nyoj543遥控器

發(fā)布時(shí)間:2025/3/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nyoj543遥控器 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

我的思路:
從x頻道轉(zhuǎn)到y(tǒng)頻道有兩種方法,取兩者按鍵次數(shù)少者


轉(zhuǎn)頻道方法1、

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


轉(zhuǎn)頻道方法2、

x頻道先跳轉(zhuǎn)到中間頻道z,再up鍵、down鍵到y(tǒng)頻道(把x跳到y(tǒng)的情況看成z==y),當(dāng)然跳轉(zhuǎn)需要 _鍵 及數(shù)字鍵有用,跳轉(zhuǎn)到小于10的頻道無(wú)需判斷 _鍵(題目已知)。跳轉(zhuǎn)時(shí)按鍵次數(shù)+up或down次數(shù)即為總按鍵次數(shù)。
先執(zhí)行方法1,再?gòu)?~99循環(huán)方法2(即把0~99頻道當(dāng)成z),得出最小值即為所求。

改進(jìn):
發(fā)現(xiàn)每次都循環(huán)0~99顯然是沒(méi)必要的,比如x=23,y=52,先由方法1得到按鍵次數(shù)min(此處為29)
我們只需循環(huán)52-(min:29-3)~~52+(min:29-3) 即26~~78=52次即可,其中3是此處跳轉(zhuǎn)到z時(shí)需要按鍵的次數(shù),由于z<10時(shí)為1,為了簡(jiǎn)化問(wèn)題復(fù)雜性干脆不減,即
y-min循環(huán)到y(tǒng)+min。循環(huán)需要一個(gè)輔助數(shù)組,比如當(dāng)x=29, y=1時(shí),min=28, 此時(shí)循環(huán)就是從73到29,注意是73->99->0->29的循環(huán),故需要一個(gè)輔助數(shù)組維持循環(huán)。

代碼如下:

#include <stdio.h> #define INF 100//表示不可到達(dá) int ctrl[15]; int getDif(int i, int j) {//從i頻道up down到j(luò)所需次數(shù) 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;//初始化輔助數(shù)組 for (i = 0; i < 301; i++) n[i] = i%100;scanf("%d", &T);while(T--) {int min = INF, count;//ctrl數(shù)組存遙控器 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為數(shù)字0-9,10為up,11為down,12為_(kāi)//按此格式輸人方便后續(xù)操作 scanf("%d%d", &i, &j);//i 跳轉(zhuǎn)到 jmin = getDif(i,j);//直接up down int m = j+101+min;i = j+100-min;//循環(huán)的開(kāi)始與結(jié)尾 if (min == INF) {//min == INF說(shuō)明up down不可用 m = j+101;i = j+100;//故調(diào)整m,i使循環(huán)中只判斷能否直接跳轉(zhuǎn)到j(luò) }for (i; i < m; i++) {int k = n[i];count = 0;if (k < 10) {//中轉(zhuǎn)頻道<10時(shí) if (ctrl[k]) {//若該鍵有用 count++;count += getDif(k, j);//中轉(zhuǎn)頻道再u(mài)p down } else count = INF;//該鍵無(wú)用} 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; }

總結(jié)

以上是生活随笔為你收集整理的nyoj543遥控器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。