Problem A Dima and Guards
Dima需要贿赂一些宿舍阿姨,每个阿姨需要果汁与巧克力,每个都有一个最小值。只需要送给她的礼物中果汁的值或巧克力的值大于阿姨的最低值,阿姨就会接受礼物。Dima寝室楼一共有四个门,每个门上有两个阿姨把手。所以Dima需挑任意一个门即可。
简单暴力题读懂题就ok了。
n>=min(a, b)+min(c, d)时满足要求。
接下来输出min(a, b)和n-min(a,b)即可注意题目中说了必须正好使用n元。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <queue> 8 #include <stack> 9 #include <vector> 10 #define INF 0x7fffffff 11 12 using namespace std; 13 14 int main() 15 { 16 // freopen("in.txt", "r", stdin); 17 int n; 18 while(scanf("%d", &n)!=EOF){ 19 int i, flag = 1; 20 for(i=1; i<=4; i++){ 21 int a, b, c, d; 22 scanf("%d%d%d%d", &a, &b, &c, &d); 23 if(n>=min(a, b)+min(c, d) && flag){ 24 cout << i << ' ' << min(a, b) << ' ' << n-min(a, b) << endl; 25 flag = 0; 26 } 27 } 28 if(flag)cout << "-1" << endl; 29 } 30 31 return 0; 32 }
Problem B Dima and To-do List
在一个序列中找一个子序列的和最小。子序列满足从1-k-1为起始点k为间隔。
暴力枚举记录起始点即可。
代码如下:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <algorithm> 7 #include <queue> 8 #include <stack> 9 #include <vector> 10 #define INF 0x7fffffff 11 12 using namespace std; 13 14 int main() 15 { 16 // freopen("in.txt", "r", stdin); 17 int n, k, task[100100]; 18 while(scanf("%d%d", &n, &k)!=EOF){ 19 for(int i=0; i<n; i++){ 20 scanf("%d", &task[i]); 21 } 22 int min = INF, minpos = -1; 23 for(int i=0; i<k; i++){ 24 int sum = task[i]; 25 int j = (i+k)%n; 26 while(i!=j){ 27 sum+=task[j]; 28 j = (j+k)%n; 29 } 30 // cout << "sum:" << sum << endl; 31 if(sum<min){ 32 min = sum; 33 minpos = i; 34 } 35 } 36 cout << minpos+1 << endl; 37 } 38 return 0; 39 }