主頁 > 後端開發 > 2020年04月10日UCF Local Programming Contest 2017

2020年04月10日UCF Local Programming Contest 2017

2020-09-15 02:21:28 後端開發

A. Electric Bill

題意:這一題比較簡單,相當于小學的分組函式的計算電力費用的的題型,

題解:簽到題,

代碼:

#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int main(){
    int F,E;
    int n;
    cin>>F>>E;
    cin>>n;
    int temp;
    while(n--){
        cin>>temp;
        int ans=0;
        cout<<temp<<" ";
        if(temp<=1000){
            cout<<temp*F<<endl;
        }else{
            cout<<1000*F+(temp-1000)*E<<endl;;
        }
    }
    return 0;
}

B. Simplified Keyboard

題意:這一題的大概意思就是新組合的字母的排列,給出了字母間相鄰的定義,題目給出兩個字串,要你在題目要求的情況下判斷這兩個字串屬于哪一種型別,

題解:簡單簽到題,根據題意對那個字串進行分情況判斷,在判斷兩個字符是否是“鄰居”時候,可利用:

net[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,-1},{-1,1}};

進行每個方向的判斷,

代碼:

#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
char arr[3][9]= {{'a','b','c','d','e','f','g','h','i'},
    {'j','k','l','m','n','o','p','q','r'},
    {'s','t','u','v','w','x','y','z','#'}
};
int net[8][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,-1},{-1,1}};
int check(int r,int c){
    if(r>=0&&r<3){
        if(r==2){
            if(c>=0&&c<=7){
                return 1;
            }
        }else{
            if(c>=0&&c<=8){
                return 1;
            }
        }
    }
    return 0;
}
int app(char a/*主體*/,char b/*客體*/){//是否是相鄰的 
    int x,y;
    for(int i=0;i<3;i++){//找到 本尊的位置 
        for(int j=0;j<9;j++){
            if(arr[i][j]==a){
                x=i;
                y=j;
                break;
            }
        } 
    }
    int d=0;
    for(int i=0;i<8;i++){
        int dx=x+net[i][0];
        int dy=y+net[i][1];//這是下一個坐標
        if(check(dx,dy)/*判斷坐標是否合法*/){
            if(arr[dx][dy]==b){//相等
            d=1;
            break;
            }else{//不相等 
            }
        } 
    }    
    return d;
}
int main() {
    int n;
    string str1,str2;
    cin>>n;
    while(n--) {
        cin>>str1>>str2;
        int len1=str1.length();
        int len2=str2.length();
        if(len1!=len2) {
            cout<<3<<endl;
        } else { //兩者的長度相同  在這里,可能輸出 1 ,可能輸出 2 ,可能輸出 3
            int f=1;
            for(int i=0; i<len1; i++) {
                if(str1[i]!=str2[i]) { //出現了不相等的
                    f=0;
                }
            }
            if(f==1) {
                cout<<1<<endl;
            } else { //可能輸出 2 ,可能輸出 3
                //以 str1 為基礎,尋找它的鄰居,或和它本身相鄰
                int g=1;//記錄是否找到 鄰居
                for(int i=0; i<len1; i++) {
                    if(str1[i]==str2[i]) { //若兩者相等
                    } else { //兩者不相等,找兩者相鄰
                        g=app(str1[i],str2[i]);
                        if(!g) {
                            break;
                        }
                    }
                }
                if(g) {
                    cout<<2<<endl;
                } else {
                    cout<<3<<endl;
                }
            }
        }
    }
    return 0;
}

C. Singin' in the Rain

題意:題目的大概意思就是:給出一張CD的歌曲數目,一串喜歡歌曲的序列,通過按下“下一曲”、“上一曲”的按鍵來改變曲目的播放順序,要你求,最少要你按多少次才能達到要求,

題解:注意播放順序的改變規則即可,模擬,

#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int main(){
    ll n;//樣例的數量 
    cin>>n;
    ll t,s;
    while(n--){
        cin>>t/*一張CD上的歌曲的總數*/>>s/*喜歡歌曲的數量*/;
        ll num[10000]={0};
        for(ll i=0;i<s;i++){
            cin>>num[i];//輸入喜歡歌曲的序號 
        }//序號輸入完畢,下面開始處理啊資料
        ll ans=0;//存盤的是答案
        ll tt=num[0];//當前播放歌曲的位置
        //當第一首歌曲播放完之后,
        ll net;//下一首要播放的歌曲
        for(ll i=1;i<s;i++){
            net=num[i];//這是下一首 
            if(net<num[i-1]){//在它之前 
                ans=ans+min(num[i-1]-net+1,t-num[i-1]-1+net);
            }else if(net>num[i-1]){//在之后 
                if(net-num[i-1]==1){//不需要按 
                }else{//需要按 
                    ans=ans+min(net-num[i-1]-1,num[i-1]+(t-net+1));
                }
            }else if(net==num[i-1]){//下一首播放的歌曲和上一首播放的歌曲一樣 
                ans++;//往后在按一次 “后退鍵 ”
                tt=net;//在一次到達原位置 
            }
            //當前歌曲播放完
        }
        cout<<ans<<endl;
    }
    return 0;
}

D. Editor Navigation

題意:這題是一個最短路的問題,給你兩個點的坐標,要你求移動最少的次數到達目的地,創新的是它給出的不是一個“規矩”的矩陣,移動的規則也和正常的題目有點不同,

題解:BFS求最短路,但要注意在確定它的下一個坐標的時候和正常的題型不同,最短路的步數和點的坐標一起整合在一個結構體中,

代碼:

#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int T,n;
int str,stc,enr,enc;
int num[900]={0};
int vis[900][900]={0};
struct node{
    int r,c,cnt;
};
int net[4][2]= {-1,0,1,0,0,-1,0,1};
void bfs(){
    queue<node> q;
    q.push({str,stc,0});
    vis[str][stc]=1;
    memset(vis,0,sizeof(vis));
    while(!q.empty()){
        node p=q.front();
        q.pop();
        int r=p.r;
        int c=p.c;
        int cnt=p.cnt;
        if(r==enr&&c==enc){//找到目標點 
            printf("%d\n",cnt);
            return ;
        }
        for(int i=0;i<4;i++){//遍歷四個方向 
            int dr=r+net[i][0];
            int dc=c+net[i][1];
            if(dr>=1&&dr<=n){
                if(i==0||i==1){//上下移動
                    if(dc<=num[dr]&&!vis[dr][dc]){//直來支直去
                        vis[dr][dc]=1;
                        q.push({dr,dc,cnt+1});
                    }
                    if(dc>num[dr]&&!vis[dr][num[dr]]){
                        vis[dr][num[dr]]=1;
                        q.push({dr,num[dr],cnt+1});
                    }
                }else{//左右移動
                    if(dc==-1&&i==2&&r-1>=1){
                        int tr=r-1;
                        int tc=num[tr];
                        if(!vis[tr][tc]){
                            q.push({tr,tc,cnt+1});
                            vis[tr][tc]=1;
                        }
                    }
                    if(dc==num[r]+1&&i==3&&r+1<=n){//這是坐標向右移動,處在最后的一個點移動到下一行的的第一個字符
                        int tr=r+1;
                        int tc=0;
                        if(!vis[tr][tc]){
                            vis[tr][tc]=1;
                            q.push({tr,tc,cnt+1});
                        }
                    }
                    if(dc>=0&&dc<=num[dr]&&!vis[dr][dc]){
                        vis[dr][dc]=1;
                        q.push({dr,dc,cnt+1});
                    }
                }
            }
        }
    }
}
int main(){
    cin>>T;
    while(T--){
       cin>>n;/*總共有幾行*/
       for(int i=1;i<=n;i++){
            cin>>num[i];
       }
       cin>>str>>stc>>enr>>enc;
       bfs();
    }
    return 0;
}

E. Simple Darts

題意:這是一道反三角函式利用的題目,給你一個圓盤,將其劃分為W個區域,每個區域的得分各不相同,向其投向n個鏢,求出最終得分,

題解:通過計算點到原點的距離,可以判斷它屬于那個環內,通過計算點與原點的連線和X軸的夾角可以判斷它屬于內閣楔形--這個的計算方法是:

double gf=atan((y*1.0)/x)*(180.0*1.0/pi);//算出應有的角度

gf是指點(x,y)與x軸所夾的銳角,但要注意當回傳的是一個負值時,可以通過增加180度or360度來進行調整,具體增加多少,要根據點所處的象限來判斷,

代碼:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
#define ll long long
double pi= 3.1415926535898 ;
using namespace std;
double app(double x,double y){
    return sqrt(x*x+y*y);
}
int main(){
    int n,t;
    int w,b,d,s;
    double x,y;
    cin>>n;//樣例的數量 
    while(n--){
        cin>>w>>b>>d>>s;
        //圓形平均分成了 w 份
        double cc=360*1.0/w;//每一份的度數
        double tch[25]={0};
        tch[1]=cc;
        for(int i=2;i<=w;i++){
            tch[i]=tch[i-1]+cc;
        }
        cin>>t;
        int ans=0;//存盤最終得分 
        //邊輸入,邊處理 
        for(int i=0;i<t;i++){
            scanf("%lf %lf",&x,&y);//輸入兩個點的坐標
            double len1=app(x,y);
            if(len1<=b){//位于  第一個小圓環中  
                ans=ans+50;
            }else{
                int f=0;//這是放大的倍數
                if(len1>b&&len1<d){
                    f=2;
                }else if(len1>d&&len1<s){
                    f=1;
                }
                //下面關鍵是判斷位于哪一個楔形內 
                double gf=atan((y*1.0)/x)*(180.0*1.0/pi);//算出應有的角度
                //判斷是否要選裝
                if(x<0&&y>0){//二象限 
                    gf=180+gf;
                }
                if(x<0&&y<0){//三象限 
                    gf=gf+180;
                }
                if(x>0&&y<0){
                    gf=gf+360;
                }
                int gg=0; 
                for(int i=1;i<=w;i++){
                    if(gf<tch[i]){//在這之中 
                        gg=i;
                        break;
                    }
                }
                ans=ans+gg*f;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/40790.html

標籤:C++

上一篇:C++中強制型別轉換的應用(第一次)

下一篇:加邊的無向圖--并查集

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more