A.組隊
- 題目描述:
作為籃球隊教練,你需要從以下名單中選出 1 號位至 5 號位各一名球員, 組成球隊的首發陣容。
每位球員擔任 1 號位至 5 號位時的評分如下表所示。請你計算首發陣容 1 號位至 5 號位的評分之和最大可能是多少?
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
- (1).由題意可得,這一號到五號,不會存在與同一行,所以我們直接可找出每一列的最大兩個數,然后進行選擇相加得值
- (2).或者將數據存入二維數組,for循環加判斷。
B.不同子串
- 題目描述:
一個字符串的非空子串是指字符串中長度至少為 1 的連續的一段字符組成 的串。例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 個。 注意在計算時,只算本質不同的串的個數。
請問,字符串0100110001010001 有多少個不同的非空子串?
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
- (1).題目中提到了不同的子串,所以我們可以選擇用集合,將滿足要求的組合放入集合中,最后.size()得到個數;
- (2).用雙重循環遍歷,然后獲取子字符串;其中用到string中的substring(i,j);
第二題:不同字串(集合)
public class 第十屆藍橋杯 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
HashSet<String>set=new HashSet<String>();
String sc=in.nextLine();
for(int i=0;i<sc.length();i++)
{
for(int j=i+1;j<=sc.length();j++)
{
set.add(sc.substring(i,j));
}
}
System.out.println(set.size());//100
}
}
C.數列求值
題目描述:
給定數列 1, 1, 1, 3, 5, 9, 17, …,從第 4 項開始,每項都是前 3 項的和。求 第 20190324 項的最后 4 位數字。
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一 個 4 位整數(提示:答案的千位不為 0),在提交答案時只填寫這個整數,填寫 多余的內容將無法得分。
- 第一眼:
乍一看,每項都是前幾項得和,我們可能會很快想到好像斐波那契數列,但是,這里求得是20190324項得最后四位數字 - 發現只是求最后4位數字,這也就變相得說明了它所受到的影響只來自於相加數的末四位,所以我們可以邊遍歷到20190324,邊加邊只保留后四位,同時也不會溢出
//第三題:數列求值
public class 第十屆藍橋杯 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int i=1,j=1,k=1;
int sum=0;
for(int a=4;a<=20190324;a++)
{
sum=(i+j+k)%10000;i=j;j=k;;k=sum;
}
System.out.println(sum);//4659
}
}
D.數的分解
題目描述:
把 2019 分解成 3 個各不相同的正整數之和,並且要求每個正整數都不包 含數字 2 和 4,一共有多少種不同的分解方法? 注意交換 3 個整數的順序被視為同一種方法,例如 1000+1001+18 和 1001+1000+18 被視為同一種。
【答案提交】
這是一道結果填空的題,你只需要算出結果后提交即可。本題的結果為一 個整數,在提交答案時只填寫這個整數,填寫多余的內容將無法得分。
- (1).第一想到的是三重循環,在每一重里面都進行一個判斷(是否包含數字2和4),最后一重判斷相加是否等於2019;
- (2).題目中提到各不相同,排列組合公式共六種(ABC,ACB,BAC,BCA,CAB,CBA),同時交換順序視為一種,所以最后有也就剩ABC這一種排列方式,令j=i+1,k=j+1,可減少次數;
第四題:數的分解
public class 第十屆藍橋杯 {
public static boolean fenjie(int a)
{
while(a>0)
{
if(a%10==2||a%10==4) {
return true;
}a/=10;
}
return false;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int ans=0;
for(int i=1;i<2019;i++)
{
if(fenjie(i))
continue;
for(int j=i+1;j<2019;j++)
{
if(fenjie(j))
continue;
for(int k=j+1;k<2019;k++)
{
if(fenjie(k))
continue;
if(i+j+k==2019) {
ans++;
}
}
}
}
System.out.println(ans);//40785
}
}
第二種方法(字符串查找)
- (3).后面想到可以用字符串查找的方式做
public class 第十屆藍橋杯 {
public static void main(String[] args) {
int num = 0;
for (int i = 1; i < 2019; i++) {
if ((i + "").indexOf("2") != -1 || (i + "").indexOf("4") != -1)
continue;
for (int j = i + 1; j < 2019; j++) {
if ((j + "").indexOf("2") != -1 || (j + "").indexOf("4") != -1)
continue;
for(int k=j+1;k<2019;k++)
{
if ((k+ "").indexOf("2") != -1 || (k + "").indexOf("4") != -1) {
continue;
}
if(i+j+k==2019)
num++;
}
}
}
System.out.println(num);//40785
}
}
F.特別的數
時間限制: 1.0s 內存限制: 512.0MB 本題總分:15 分
【問題描述】
小明對數位中含有 2、0、1、9 的數字很感興趣(不包括前導 0),在 1 到 40 中這樣的數包括 1、2、9、10 至 32、39 和 40,共 28 個,他們的和是 574。 請問,在 1 到 n 中,所有這樣的數的和是多少?
【輸入格式】
輸入一行包含兩個整數 n。
【輸出格式】
輸出一行,包含一個整數,表示滿足條件的數的和。
【樣例輸入】 40
【樣例輸出】 574
【評測用例規模與約定】 對於 20% 的評測用例,1≤n≤10。 對於 50% 的評測用例,1≤n≤100。 對於 80% 的評測用例,1≤n≤1000。 對於所有評測用例,1≤n≤10000。
- (1).將int轉換為String,用String.indexof()判斷;
- (2).使用while循環加%和/進心計算判斷
第六題:特別數的和
public class 第十屆藍橋杯 {
public static void main(String[] args) {
Scanner in=new Scanner (System.in);
int n=in.nextInt();int ans=0;
for(int i=1;i<=n;i++)
{
int a=i;
while(a>0)
{
if(a%10==2||a%10==0||a%10==1||a%10==9) {
ans+=i;break;
}
a/=10;
}
}
System.out.println(ans);//樣例40,輸出574
}
}
特別的數第二種方法(.indexOf())
第六題:特別數的(字符解決方法)
public class 第十屆藍橋杯 {
public static void main(String[] args) {
//先將1-n的數字轉換為string,用string中的indexof();
Scanner in=new Scanner (System.in);
int n=in.nextInt();
int ans=0;
for(int i=1;i<=n;i++)
{
String ss=Integer.toString(i);
if(ss.indexOf("2")!=-1||ss.indexOf("0")!=-1||ss.indexOf("1")!=-1||ss.indexOf("9")!=-1)
{
ans+=i;
}
}
System.out.println(ans);//樣例40,輸出574
}
}
G.外賣優先級
題目描述:
時間限制: 1.0s 內存限制: 512.0MB 本題總分:20 分
“飽了么”外賣系統中維護着 N 家外賣店,編號 1 ∼ N。每家外賣店都有 一個優先級,初始時 (0 時刻) 優先級都為 0。 每經過 1 個時間單位,如果外賣店沒有訂單,則優先級會減少 1,最低減 到 0;而如果外賣店有訂單,則優先級不減反加,每有一單優先級加 2。 如果某家外賣店某時刻優先級大於 5,則會被系統加入優先緩存中;如果 優先級小於等於 3,則會被清除出優先緩存。 給定 T 時刻以內的 M 條訂單信息,請你計算 T 時刻時有多少外賣店在優 先緩存中。
【輸入格式】 第一行包含 3 個整數 N、M 和 T。 以下 M 行每行包含兩個整數 ts 和 id,表示 ts 時刻編號 id 的外賣店收到 一個訂單。
【輸出格式】
輸出一個整數代表答案。
【樣例輸入】 2 6 6 1 1 5 2 3 1 6 2 2 1 6 2
【樣例輸出】 1
【樣例解釋】 6 時刻時,1 號店優先級降到 3,被移除出優先緩存;2 號店優先級升到 6, 加入優先緩存。所以是有 1 家店 (2 號) 在優先緩存中。
【評測用例規模與約定】 對於 80% 的評測用例,1≤ N,M,T ≤10000。 對於所有評測用例,1≤ N,M,T ≤100000,1≤ts≤T,1≤id ≤ N
- (1).對數據進行處理:設置一個二維數組a[i][j],i表示店鋪的編號,j表示某時刻。
- (2).循環輸入ts,id,相對應a[id][ts]++,表示此時刻有訂單;設置一個表示優先緩存店鋪數組ans[i],通過對ans[i]的不同操作引起值的變化
- (2).1.當a[i][j]==1的時候,則對其ans[i]+=a[i][j]*2;否則ans[i]=Math.max(0,ans[i]-1)
//第五題:外賣優先級
public class 第十屆藍橋杯 {
public static void main(String[] args) {
Scanner in=new Scanner (System.in);
int N=in.nextInt();int M=in.nextInt();int T=in.nextInt();
int [][]a=new int[N+1][M+1];
int []ans=new int[N+1];
HashMap<Integer,Integer> map=new HashMap<>();
//第一步:先進行數據的輸入,對輸入的數據進行處理
for(int i=0;i<M;i++)
{
int ts=in.nextInt();//時刻
int id=in.nextInt();//店鋪編號
if(ts<T)
a[id][ts]++;
}
for(int i=0;i<N;i++)
{
for(int j=0;j<T;j++)
{
if(a[i][j]==1)
ans[i]+=a[i][j]*2;
else ans[i]=Math.max(0, ans[i]-1);
if(ans[i]>5)
map.put(i,1);
if(ans[i]<=3)
map.remove(i);
}
}
System.out.println(map.size());
}
}