結果
問題 | No.398 ハーフパイプ(2) |
ユーザー | koyumeishi |
提出日時 | 2015-10-27 23:54:07 |
言語 | C++11 (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 1,184 ms / 2,000 ms |
コード長 | 1,578 bytes |
コンパイル時間 | 2,150 ms |
コンパイル使用メモリ | 86,780 KB |
実行使用メモリ | 100,740 KB |
最終ジャッジ日時 | 2024-06-27 14:20:03 |
合計ジャッジ時間 | 22,376 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 17 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:69:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 69 | scanf("%d.%d", &a,&b); | ~~~~~^~~~~~~~~~~~~~~~
ソースコード
#include <iostream> #include <vector> #include <cstdio> #include <map> #include <algorithm> #include <functional> #include <cassert> using namespace std; #define SZ 101 #define NUM 6 map<int,long long> m; //resize(vector, {v1,v2,v3}); void resize(int& val , vector<int>::iterator itr){val = 0;} void resize(long long& val , vector<int>::iterator itr){val = 0;} void resize(double& val , vector<int>::iterator itr){val = 0;} template<class T> void resize(vector<T>& vec, vector<int>::iterator itr){ vec.resize(*itr); for(int i=0; i<*itr; i++){ resize(vec[i], itr+1); } } template<class T> void resize(T& vec, vector<int> sz){ resize(vec, sz.begin()); } int main(){ vector<vector<vector<long long>>> dp; //dp[min][max][sum] resize(dp, {SZ,SZ,SZ*NUM+1}); for(int i=0; i<SZ; i++){ dp[i][i][i] = 1; } for(int i=1; i<NUM; i++){ vector<vector<vector<long long>>> dp_; resize(dp_, {SZ,SZ,SZ*NUM+1}); for(int k=0; k<SZ; k++) for(int min_=0; min_<SZ; min_++) for(int max_=min_; max_<SZ; max_++) for(int sum=0; sum<i*SZ; sum++){ dp_[min(min_,k)][max(max_,k)][sum+k] += dp[min_][max_][sum]; } swap(dp, dp_); } for(int min_=0; min_<SZ; min_++) for(int max_=min_; max_<SZ; max_++) for(int sum=0; sum<NUM*SZ; sum++){ if(dp[min_][max_][sum] > 0) m[sum-(min_+max_)] += dp[min_][max_][sum]; } // cout << "{"; // for(int i=0; i<=200; i++){ // cout << m[i] << (m[i]>1e9?"LL":"") << ","; // } // cout << "}" << endl; int a,b; scanf("%d.%d", &a,&b); a = (a*100+b)/25; assert(0<=a && a<=400); cout << m[a] << endl; return 0; }