COCI2013/2014#ROUND1完整解题报告
T1.TRENER
题意:给出N个字符串,输出出现次数大于等于5次的首字母,如果没有输出 “PREDAJA”。
数据范围:1<=N<=150
样例:
input 1:
18
babic
keksic
boric
bukic
sarmic
balic
kruzic
hrenovkic
beslic
boksic
krafnic
pecivic
klavirkovic
kukumaric
sunkic
kolacic
kovacic
prijestolonasljednikovic
output 1:
bk
input 2:
6
michael
jordan
lebron
james
kobe
bryant
output 2:
PREDAJA
题解:水题,没什么可说。见代码。
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#define ll long long
using namespace std;
int n,cnt[30];
string s;
bool f;
int main()
{
freopen("trener.in","r",stdin);
freopen("trener.out","w",stdout);
cin>>n;
for(int i=0;i<n;i++)
{
cin>>s;
cnt[s[0]-'a']++;
}
for(int i=0;i<26;i++)
if(cnt[i]>=5)
{
f=1;
cout<<(char)(i+'a');
}
if(!f) cout<<"PREDAJA";
cout<<endl;
return 0;
}
T2.KUŠAČ
题意:M个人平均地分吃N根香肠。求最少要切的刀数。
数据范围:1<=N,M<=100
样例:
input 1:
2 6
output 1:
4
input 2:
3 4
output 2:
3
input 3:
6 2
output 3:
0
题解:这道题是模拟。许多人会想到gcd之类的东西,但事实上不需要。请仔细思考。
我们可以将所有香肠首尾接在一起,成为一根完整的香肠,平均切就好了。如果需要切的地方是原来香肠的接口,这一刀就不用切了。
核心代码如下,极短。
cin>>n>>m;
for(int i=0;i<=n*m;i+=n) if(i%m!=0) ans++;
cout<<ans<<endl;
T3.RATAR
题意:给出一个N*N的矩阵,求满足条件的矩阵对的个数:两个矩阵有且仅有一个公共顶点,且它们的元素和相等。
数据范围:1<=N<=50
样例:
input 1:
3
1 2 3
2 3 4
3 4 8
output 1:
7
input 2:
4
-1 -1 -1 -1
1 2 3 4
1 2 3 4
1 2 3 4
output 2:
10
input 3:
5
-1 -1 -1 -1 -1
-2 -2 -2 -2 -2
-3 -3 -3 -3 -3
-4 -4 -4 -4 -4
-5 -5 -5 -5 -5
output 3:
36
题解:前缀和预处理每个点与左上角形成的矩阵的元素和,然后枚举对顶点,枚举左上-右下,左下-右上符合条件的矩阵(小小地用一下容斥原理),记录个数,O(N^4)暴力枚举就能过。
一个小细节:当你在一个频繁调用的函数或循环里使用了memset时,请三思。memset复杂度为O(N),可能会导致TLE。在本题中,可以使用几个临时数组来记录待改变的值,赋值后再改回0,复杂度为O(2500),可有效避免超时。
代码如下:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#define ll long long
using namespace std;
int mp[55][55],sum[55][55],pre[55][55];
int tmp[5000005],ans,n,ding[2505];
int get(int x,int y,int x2,int y2)
{
return sum[x2][y2]-sum[x2][y-1]-sum[x-1][y2]+sum[x-1][y-1];
}
int main()
{
freopen("ratar.in","r",stdin);
freopen("ratar.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)