问题 A: No Problem!
题意:
将获得一年中每个月产生的问题数量和每个月所需的问题数量。如果一个月内需要N个问题,而此时没有足够的问题,则该月的所有比赛都会被取消。编写一个程序,以确定是否有足够的问题参加比赛。请记住,如果问题在X月中创建,则只能在X+1月和后几个月使用。
解题思路:
前缀和相减。
AC代码:
问题 K: 足球联赛
题意:
以样例1为例:
3
-1 -1 4 3 1 2
0 0 -1 -1 3 0
1 2 1 1 -1 -1
根据足球联赛的得分规则,以双方进球多少评判比赛胜负,比赛战平(进球数一样多),双方各得1分;如果比赛分出胜负,那么获胜方(进球多的)得到3分,输的那方不得分。
队1在主场一胜一负,得到3分,在客场一胜一平,得到4分。队1的总积分为7分。
队2在主场一胜一平,得到4分,在客场一平一负,得到1分,队2的总积分为5分。
队3总得分为4分
因此,队1分数最高,可以获得冠军。联赛规定,若有多个得分最高的队伍,他们将分享冠军的荣誉,同时获得冠军。
输入
第一行一个整数n,表示参加联赛的球队数量,小明支持的就是队1。
接下来n行,每行n*2个整数,第i行第j对整数表示队i在主场对阵队j的比赛情况,两个整数分别表示主队(队i)和客队(队j)的进球数。当i=j的时候,两个整数用-1表示,自己和自己踢球的情况是不存在的。
输出
若队1夺冠,那么在第一行输出“Yes”;若1队的总积分不是最高的,那么在第一行输出“No”。
第二行输出一个整数,表示队1的赛季总积分。
解题思路:
模拟即可。用一个矩阵存取主客场对战得分表,每隔一行两个相邻的数进行比较即可(都是-1时需要特判),另开一个数组a存储每一个队的结果。需注意计算存取时的下标如何转换。
AC代码:
#include <iostream>
using namespace std;
int g[100][100];
int a[10010];
int main()
{
int n;
cin>>n;
//输入
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n*2;j++)
{
cin>>g[i][j];
}
}
//计算每只队得分
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n*2;j+=2)
{
if(g[i][j]>g[i][j+1])
a[i]+=3;
else if(g[i][j]==g[i][j+1]&&g[i][j]!=-1&&g[i][j+1]!=-1)
{
a[i]+=1;
a[(j+1)/2]+=1;
}
else if(g[i][j]<g[i][j+1])
a[(j+1)/2]+=3;
}
}
//判断比较赢家
int max=-10000;
for(int i=1;i<=n;i++)
{
if(a[i]>=max)
max=a[i];
}
//输出
if(a[1]==max)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
cout<<a[1];
return 0;
}
问题 M: 一箭多雕
题意:
有n只雕,现在需要用箭将其射下,但是我们的箭一支射落多个雕,射中一直后箭的高度会自动减1,如果减一之后这支箭射不到雕这之箭就,每支箭射之前可以自由调高度
解题思路:
AC代码:
#include <iostream>
#include <unordered_map>
using namespace std;
unordered_map<int,int>tt;
int n,x,res=0;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
tt[x]++;
if(tt[x+1]) tt[x+1]--;
else res++;
}
cout<<res;
}