1. 程式人生 > >CCF 201709-2 公共鑰匙盒

CCF 201709-2 公共鑰匙盒

正確程式碼來源(ps:大家可以自己找) 總體思路就是根據題意解題,但是由於數字範圍限制,採用結構體更方便,但是我不太會用。。。看到很多解這個題的方法都是用結構體。

本來自己寫的是用for迴圈和if語句暴力解決問題,雖然可能是對的,但是提交後超時了,得了70分。。。不過確實這個不適合for迴圈,它的數字範圍太大了,多個for迴圈巢狀非常耗時間,大家看看就好,求輕噴。。。

下面是我自己寫的程式碼

#include<iostream>
using namespace std;

int main()
{
    int n,k;
    cin>>n>>k;

    int
w[k],s[k],c[k],e[k]; //分別是題目中的w,s,c,e是結束時間 for(int i=0;i<k;i++) { cin>>w[i]>>s[i]>>c[i]; } int max_e=-1; for(int i=0;i<k;i++) { e[i]=c[i]+s[i]; if(e[i]>max_e)//時間範圍 { max_e=e[i]; } } int key[n+1
]; //key[i]=j表示第i位置上是j鑰匙 for(int i=0;i<=n;i++) { key[i]=i; } for(int i=0;i<=max_e;i++) //時間線 { int count=0; //判斷是否有多個人在同一時刻還鑰匙 for(int a=0;a<k;a++) { if(e[a]==i) { count++; if(count>=2
) break; } } if(count==1) //在當前時刻只有一個人還 { for(int a=0;a<k;a++) { if(e[a]==i) { for(int z=1;z<=n;z++) //找到左邊第一個空位 { if(key[z]==0) { key[z]=w[a]; break; } } } } } else //多個人同時還鑰匙 { for(int m=1;m<=n;m++)//鑰匙的序號從小到大,序號線,類似時間線 { for(int x=0;x<k;x++) { if(m==w[x]&&e[x]==i)//序號小的先還 { for(int z=1;z<=n;z++)//找到空位放進去 { if(key[z]==0) { key[z]=w[x]; break; } } } } } } for(int j=0;j<k;j++) //先還後借 { if(s[j]==i) { for(int d=1;d<=n;d++) { if(w[j]==key[d]) { key[d]=0; break; } } } } } for(int i=1;i<=n;i++) { cout<<key[i]<<" "; } return 0; }