A-计划日
Dr. Kong, 作为一名从教多年的老师,跟踪了大量成绩好的学生,发现他们的学习习惯非常规律,有方法、有计划、有目标、有总结。比如:已考上**大学的李明同学,从小学开始订学习计划,达成目标。每经过N天就检查目标是否完成,写总结,并确定下一个学习目标。
已知李明在YYYY年MM月DD日星期W订了学习计划,现在想看看李明N天后的完成情况和个人总结,你能告诉我那天的日期和星期几吗?
输入:
第一行: T 表示以下有T组测试数据( 1≤ T ≤8 )对每组数据, 占一行:
YYYYMMDD W N(20000101≤YYYYMMDD≤20180527 1≤W≤ 7 1 ≤N≤ 8000 )
输出:
对每组测试数据,输出占一行,格式为:YYYYMMDD W ( 中间一个空格 )
#include <stdio.h>
#include<iostream>
using namespace std;
int a[13]={0,31,0,31,30,31,30,31,31,30,31,30,31};
void judge(int n)//封装闰年函数改数组极好
{
if(n%400==0||(n%100!=0&&n%4==0))
a[2]=29;
else
a[2]=28;
}
int main()
{
int t,i,y,year,month,day,w,n,d,week;
cin>>t;
while(t--)
{
scanf("%d %d %d",&y,&w,&n);
year=y/10000;
month=y/100%100;
day=y%100;
judge(year);
week=(w+n)%7;//周几加之后第几天对7求余
if(week==0)
week=7;
while(n--)
{
day++;//这个方法好,边-n,边判断当月,比整个+好
if(day>a[month]){
day=1;
month++;
}
if(month==13){
year++;
judge(year);
month=1;
}
}
printf("%d%02d%02d %d\n",year,month,day,week);//c语言填0和站位的好处
}
return 0;
}
B-治安管理
YYH大型活动将在[S,F)这段时间举行,现要求活动期间任何时刻巡逻的警察人数不少于M人。公安机关将有N名警察在维护活动的安全,每人巡逻时间为[ai,bi)。请你检查目前的值班安排,是否符合要求。若满足要求,输出YES,并输出某个时刻同时巡逻的最多人数;若不满足要求,输出NO,并输出某个时刻同时巡逻的最少人数。
输入
第一行: T 表示以下有T组测试数据( 1≤ T ≤5 )
对每组数据,
第一行:N M S F ( 1≤N≤10000 1≤M ≤1000 0≤S<F≤100000)
第二行,a1 a2 …. an 警察巡逻起始时间
第三行,b1 b2 …. bn 警察巡逻结束时间 ( 0≤ai0 i=1…. n)
输出:
对每组测试数据,输出占一行。若满足要求,输出YES,并输出某个时刻同时巡逻的最多人数;若不满足要求,输出NO,并输出某个时刻同时巡逻的最少人数。(中间一个空格)
#include<iostream>
using namespace std;
int main()
{
int t,n,m,s,f;
cin >> t;
while (t--)
{
int flag = 0,minz=99999999,maxz=-1;
int a[10005] = { 0 }, b[10005] = { 0 }, c[100005] = { 0 };
//1重
cin >> n >> m >> s >> f;
//二重
for (int i = 0; i < n; i++)
cin >> a[i];
//三重
for (int j = 0; j< n; j++)
cin >> b[j];
for (int k = 0; k < n; k++)
{
for (a[k]; a[k] < b[k]; a[k]++)
c[a[k]]++;
}
/*for (int l = s; l < f; l++)
{
if (minz>c[l])
minz = c[l];
if (maxz<c[l])
maxz = c[l];
}*/
for (int i = s; i<f; i++) {//找到数组的最大值和最小值
if (minz>c[i])minz = c[i];
if (maxz<c[i])maxz = c[i];
}
if (minz >= m)cout << "YES " << maxz << endl;
else cout << "NO " << minz << endl;
}
/* if (c[minz]>=m)
cout << "YES " << maxz << endl;
else
cout << "NO " << minz << endl;
}*/
return 0;
}
H- Attack City and Capture Territory
简单的尼姆博弈。。去年小白没看博弈论亏大发了,。。学长也不会,,本来就有铜了。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,m;
cin>>n;
while(n--)
{
//不要用数组,直接读一个判断一个
cin>>m;
int zero=0;
for(int i=1;i<=m;i++)
{
int v;
scanf("%d",&v);//大循环读入用scanf优化
zero^=v;
}
zero==0?(cout<<"Liu_B is not sure to win."<<endl):(cout<<"Liu_B is sure to win."<<endl);//这个调调也挺有趣的
}
return 0;
}
F Gene mutation
之前想到了这样取出来排序做,少了个先决条件,相邻的,这次从下标位开始每次搞c位一个个比过去。
#include<iostream>
#include<algorithm>
using namespace std;
int arr1[20100];
int arr2[20];
int arr3[20];
int main()
{
int t;
cin >> t;
while (t--)
{
int cnt = 0;
int n;
cin >> n;
for (int i = 0; i<n; i++)
cin >> arr1[i];//输入n个原序数
int c;
cin >> c;
for (int i = 0; i<c; i++)
cin >> arr2[i];//读入c个默认数
sort(arr2, arr2 + c);//将c数组排序
int j;
for (int i = 0; i <= n - c; i++)//从0位置开始,每次取c个
{
for (j = i; j<i + c; j++)//取数
{
arr3[j - i] = arr1[j];//arr3[]放临时取值
}
sort(arr3, arr3 + c);//排序arr3
int tt = arr3[0] - arr2[0];//这个比遍历不知道高级多少
for (j = 1; j<c; j++)//判断
{
if (arr3[j] - arr2[j] != tt)
break;
}
if (j == c)
cnt++;
}
cout << cnt << endl;
}
return 0;
}