题目链接:
Example
input
Copy
3 2 0 1 0 0 0 0 0 100000000 1 0 0 0 1 0 1 1 1 0 0 0 0 0 0
output
Copy
8 233333332 1
本题的题意其实很简单,就是用一个长度为7的数组a[]表示,如果a[i]=1则说明星期i的时候,xx大学这一天为学生上课,否则如果为0,则学生这一天不上课(不上课也要待在学校!).
现在给你数组a,以及这个学生想要上课的天数k.
请问这个学生最少要在学校呆多少天(他可以在任意一天来),才能满足他上满k天的课的要求?
解法可以将其看作两部分!
1, 学生需要完整上完一个星期的天数
2, 学生可以选择上的天数
这里完整上的天数可以用 k/cnt表示,其中,k是学生期望的上课数, cnt是一周的课数。
于是,需要完整上的天数就是 : 7*x!
但是要考虑一个特殊情况,若k%cnt = 0。也就是刚刚好整除,这个时候需要我们 7*x-7因为有一个星期他不用完整上完。
具体步骤看我的AC代码解释吧
AC代码如下:
#include <iostream> #include <cstdio> using namespace std; const int MX = 10; int mp[10]; int main() { int T; scanf("%d", &T); while(T--) { int k; int ans = 0; int cnt = 0; scanf("%d", &k); for(int i = 1; i <= 7; ++i) scanf("%d", &mp[i]); for(int i = 1; i <= 7; ++i) if(mp[i] == 1) cnt++; int x = k/cnt; // 期望的课数除以每个星期有课数,可以得到需要上多少天(整的星期) int n = k%cnt; // 余数可知除了整的个数外还期望上多少课 ans = 7*x; // 先求整的天数 if(n == 0) // 若可以整除,则说明第一个星期不需要上完,这个时候需要判断 { ans -= 7; // 先把第一个星期减掉 n = cnt; // 还需要一个星期的课也就是cnt } int mn = 7; for(int i = 1; i <= 7; ++i) { int day = 0; cnt = 0; for(int j = i; ;j++) //从第i天开始计算可以上课的的值 { day++; //循环一次多一天 if(mp[(j-1)%7+1] == 1) cnt++; // 这里(j-1)%7+1的意思是j大于7的时候相当于返回来从1开始 if(cnt == n) { mn = min(mn, day); break; } } } ans += mn; printf("%d ", ans); } }
如有疑问,欢迎评论指出!