CodeForces - 1089G

题目链接:
http://codeforces.com/contest/1089/problem/G
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 
#include 

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\n", ans);
    }
}
View Code

如有疑问,欢迎评论指出!



你可能感兴趣的:(CodeForces - 1089G)