试题一:复习安排
输入包含多组测试数据。首先输入一行包含两个数据复习的天数d和所用总时间sumtime。
接下来的d行,每一行含有两个数据,分别表示父亲希望儿子复习的时间的下线imintime和上限imaxtime。
儿子只记录了复习所用总时间数,但是为了向父亲汇报,他必须要汇报出每天安排的复习时间数,以完成父亲的要求,请帮助他设计每天复习的时间。
如果无法完成安排,则输出“No”;如果可以完成安排,则输出"Yes",并且输出安排每天复习的时间数。为了博得父亲的开心,他希望使得前期复习的时间数尽量多。
输入测试:
1 48
2 7
2 5
0 1
3 5
输出测试:
No
Yes
1 4
代码实现:
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 struct Limit 7 { 8 int imintime; 9 int imaxtime; 10 }; 11 12 typedef struct Limit limit; 13 14 15 int main() 16 { 17 int d, sumtime; 18 while (cin >> d >> sumtime) 19 { 20 21 limit *num = new limit[d]; 22 int totalmin = 0; 23 int totalmax = 0; 24 int left = sumtime; 25 vector<int> vec(d,0); 26 for (int i = 0; i<d; ++i) 27 { 28 cin >> num[i].imintime >> num[i].imaxtime; 29 totalmin += num[i].imintime; 30 totalmax += num[i].imaxtime; 31 vec[i] = num[i].imintime; 32 left -= vec[i]; 33 } 34 35 36 int temp; 37 if (sumtime<totalmin || sumtime>totalmax) 38 { 39 cout << "No" << endl; 40 continue; 41 } 42 else if (sumtime >= totalmin&&sumtime <= totalmax) 43 { 44 for (int i = 0; i < d; ++i) 45 { 46 if (left>0) 47 { 48 if (left >= num[i].imaxtime-num[i].imintime) 49 { 50 vec[i] = num[i].imaxtime; 51 left = left-(num[i].imaxtime-num[i].imintime); 52 } 53 else 54 { 55 vec[i] += left; 56 left = 0; 57 } 58 } 59 } 60 } 61 62 cout << "Yes" << endl; 63 for (int i = 0; i < vec.size(); i++) 64 { 65 if (i < vec.size() - 1) 66 { 67 cout << vec[i] << " "; 68 } 69 else 70 cout << vec[i] << endl; 71 } 72 } 73 system("pause"); 74 return 0; 75 }
用例测试:
试题二:选举游戏
每一组测试数据包含两行,第一行只有一个数据d,表示候选人的总数。
第二行包含一组数据,表示这d个候选人当前的最大可能得票数。
其中这组数据的第一个是你本人的得票数,为了使得自己能够成功在本次选举中获胜(票数最高),请设计出你最少需要拉多少票,以及从每个其他候选人身上拉得的票数。
代码实现:
1 #include <iostream> 2 #include <vector> 3 4 using namespace std; 5 6 7 int getmaxindex(vector<int> myvec) 8 { 9 int index = 0; 10 int max = 0; 11 for (int i = 0; i < myvec.size(); i++) 12 { 13 if (myvec[i]>=max) 14 { 15 max = myvec[i]; 16 index = i; 17 } 18 } 19 return index; 20 } 21 22 int main() 23 { 24 int d; 25 cin >> d; 26 vector<int> vec(d, 0); 27 for (int i = 0; i < d; i++) 28 { 29 cin >> vec[i]; 30 } 31 int original = vec[0]; 32 vector<int> original_vec(vec.begin(),vec.end()); 33 while (1) 34 { 35 if (getmaxindex(vec) != 0) 36 { 37 vec[getmaxindex(vec)]--; 38 vec[0]++; 39 } 40 else 41 break; 42 } 43 cout << vec[0] - original << endl; 44 45 for (int i = 1; i < d; i++) 46 { 47 if (i < d - 1) 48 cout << original_vec[i] - vec[i] << " "; 49 else 50 cout << original_vec[i] - vec[i] << endl; 51 52 } 53 54 system("pause"); 55 return 0; 56 }
用例测试: