CCF-CSP201809-4 再賣菜
問題描述:
試題編號: | 201809-4 |
試題名稱: | 再賣菜 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: |
問題描述 在一條街上有n個賣菜的商店,按1至n的順序排成一排,這些商店都賣一種蔬菜。 輸入格式 輸入的第一行包含一個整數n,表示商店的數量。 輸出格式 輸出一行,包含n個正整數,依次表示每個商店第一天的菜價。 樣例輸入 8 樣例輸出 2 2 2 1 6 5 16 10 資料規模和約定 對於30%的評測用例,2<=n<=5,第二天每個商店的菜價為不超過10的正整數; |
非常鬼畜,又和賣菜相關。
一開始看到題,感覺非常複雜,毫無頭緒,寫完第五題後回頭看時突然想到dfs。
最終考場上拿了50分。
今天一開始做只拿了20分
20分程式碼:
////CSDN部落格:https://blog.csdn.net/qq_40889820 #include<iostream> #include<sstream> #include<algorithm> #include<string> #include<cstring> #include<iomanip> #include<vector> #include<cmath> #include<ctime> #include<stack> #include<queue> #include<map> #define mem(a,b) memset(a,b,sizeof(a)) #define e 2.71828182 #define Pi 3.141592654 using namespace std; int n,d1[301],d2[301]; void dfs(int step) { if(step==n) { for(int money=1;money<=199;money++) { d1[n]=money; if(int((d1[n-1]+d1[n])/2)>d2[n]) return; if(int((d1[n-1]+d1[n])/2)==d2[n]) { for(int j=1;j<=n;j++) cout<<d1[j]<<' '; exit(0); } } return; } for(int money=1;money<=298;money++) { d1[step]=money; if(step==1) dfs(step+1); else if(step==2) { if(int((d1[1]+d1[2])/2)<d2[1]) continue; else if((int((d1[1]+d1[2])/2)==d2[1])) dfs(step+1); else if(int((d1[1]+d1[2])/2)>d2[1]) return; } else { if(int((d1[step-2]+d1[step-1]+d1[step])/3)<d2[step-1]) continue; else if(int((d1[step-2]+d1[step-1]+d1[step])/3)==d2[step-1]) dfs(step+1); else if(int((d1[step-2]+d1[step-1]+d1[step])/3)>d2[step-1]) return; } } } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>d2[i]; mem(d1,0); dfs(1); }
到晚上仔細思考了一下,原因是列舉最後一家商店第一天菜錢後,影響到的應該是倒數第二家和最後一家商店的菜錢
20分的程式碼只考慮到了對最後一家的影響。改了後我以為是50分,沒想到!!!
嗯嗯嗯???這就80分了??一失足成千古恨,現在也記不清考場上漏了啥。只差那30就上400了呀!我tm
80分程式碼:
////CSDN部落格:https://blog.csdn.net/qq_40889820
#include<iostream>
#include<sstream>
#include<algorithm>
#include<string>
#include<cstring>
#include<iomanip>
#include<vector>
#include<cmath>
#include<ctime>
#include<stack>
#include<queue>
#include<map>
#define mem(a,b) memset(a,b,sizeof(a))
#define e 2.71828182
#define Pi 3.141592654
using namespace std;
int n,d1[301],d2[301];
void dfs(int step)
{
if(step==n)
{
for(int money=1;money<=199;money++)
{
d1[n]=money;
if(int((d1[n-1]+d1[n])/2)>d2[n]||int((d1[n-2]+d1[n-1]+d1[n])/3)>d2[n-1]) return;
if(int((d1[n-1]+d1[n])/2)==d2[n]&&int((d1[n-2]+d1[n-1]+d1[n])/3)==d2[n-1])
{
for(int j=1;j<=n;j++)
cout<<d1[j]<<' ';
exit(0);
}
}
return;
}
for(int money=1;money<=298;money++)
{
d1[step]=money;
if(step==1) dfs(step+1);
else if(step==2)
{
if(int((d1[1]+d1[2])/2)<d2[1]) continue;
else if((int((d1[1]+d1[2])/2)==d2[1])) dfs(step+1);
else if(int((d1[1]+d1[2])/2)>d2[1]) return;
}
else
{
if(int((d1[step-2]+d1[step-1]+d1[step])/3)<d2[step-1]) continue;
else if(int((d1[step-2]+d1[step-1]+d1[step])/3)==d2[step-1]) dfs(step+1);
else if(int((d1[step-2]+d1[step-1]+d1[step])/3)>d2[step-1]) return;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>d2[i];
mem(d1,0);
dfs(1);
}
至於滿分的話,有用記憶化搜尋的,有用差分約束的。
哭遼