{2018.5.7}荀(gou)彧(huo)同学的第二次考试小总结

本文总结了四道编程挑战题,包括恐怖服装、密码锁、采蘑菇的拖拉机和牛语等,通过实战经验分享了算法设计与实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不知不觉就第二次考试了;

荀彧同学由于有些事没有完成考试;

但是今天回来还是好好的完成了所有题;

确实学到了很多;

1>恐怖服装

上题目:

【问题描述】

万圣节又到了!农场主—小查打算带他的奶牛去参加一个化装晚会,但是,小查只做了一套能容下两头总长不超过S(1 <= S <= 1,000,000)的牛的恐怖服装。小查养了N(2 <= N <= 20,000)头按1..N顺序编号的奶牛,编号为i的奶牛的长度为Li(1 <= Li <= 1,000,000)。如果两头奶牛的总长度不超过S,那么她们就能穿下这套服装。

小查想知道,如果他想选择两头不同的奶牛来穿这套衣服,一共有多少种满足

条件的方案。

 

【输入】

* 第1行: 2个用空格隔开的整数:N 和 S

    * 第2..N+1行: 第i+1为1个整数:Li

 

【输出】

* 第1行: 输出1个整数,表示小黄可选择的所有方案数。注意奶牛顺序不同的两种
     方案是被视为相同的

 

【输入输出样例1

halloweena.in

halloween.out

4 6

3

5

2

1

 

4

 

输出说明:

  4种选择分别为:奶牛1和奶牛3;奶牛1和奶牛4;奶牛2和奶牛4;奶牛3和
奶牛4。  

【时间限制】  

1s

 这是一道无比适合暴力枚举的题目;

而且改题目的一定是我们嘤才班的某位可爱的蒟蒻;

感谢刘大佬没有放上很恶心的测试数据;

让暴力枚举爆掉;

反而ac了;

暴力枚举的代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,s,a[20100],ans=0;
cin>>n>>s;
for(int i=1;i<=n;i++)
    cin>>a[i];
for(int i=1;i<=n;i++)
    for(int j=i+1;j<=n;j++)
    {
    if(a[i]+a[j]<=s)
        ans++;
    }
cout<<ans<<endl;
return 0;

}

二重循环的暴力搜索;

让两头牛一头一头配对;

简单快捷;

但是!

听说这题还可以用凑出一个世界的二分法来做;

这里就不提供代码了;

毕竟二分法还不在我的理解范围之内;

end...

2>密码锁

上题目:

【问题描述】

从前有一个忧桑的故事:农夫小章的奶牛一直从他的农场逃离并且导致了巨额损失。
为了阻止它们逃离,他找来了一只神奇的锁来阻止他的奶牛打开栅栏门。
这个锁有三个密码子,每个都是从1-n的整数(1<=n<=100),1和n是相邻的,因为这些密码子是一个圈。有两组密码能够打开这个锁,一个是农夫小章的,另一个是锁匠的。然而,这个锁有一个小的容错的几率,它会打开只要表盘上的数字位置与任意一个密码上的相应数字位置相差不超过2。比如,如果小章的密码是(1,2,3),锁匠的密码是(4,5,6)如果你的输入是(1,n,5)(因为这和小章的密码很相近)或者是(2,4,8)(因为这和锁匠的密码很接近)这个锁会打开,。注意,(1,5,6)无法打开这个锁,因为它和任何一个密码都不接近。
给出小章的密码和锁匠的密码,请找出所有不同的能打开锁的密码的数目。另外,(1,2,3)和(3,2,1)是不同的。

 

【输入】

第一行:一个整数n
第二行:3个用空格分开的整数,代表小章的密码
第三行:3个用空格分开的整数,代表锁匠的密码(很可能和小章的密码相同)

 

【输出】

密码数

 

 

【输入输出样例1

lock.in

lock.out

50

1 2 3

5 6 7

249

 

【时间限制】  

1s

这道题依旧是某位嘤才改的题吧;

看到这个题目依旧想到暴力枚举;

开了一个万恶的三重循环;

有可能超时;

但是!

一开始没有考虑周全;

忘记了两个数的绝对值应该大于n-3;

于是就……凉凉;

后来仔细想了想;

代码就是这样的:

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,a1,a2,a3,b1,b2,b3,ans=0;
cin>>n;
cin>>a1>>a2>>a3;
cin>>b1>>b2>>b3;
for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
        for(int k=1;k<=n;k++)
        {
        bool flag=0;
        if((abs(i-a1)>n-3||abs(i-a1)<3)&&(abs(j-a2)>n-3||abs(j-a2)<3)&&(abs(k-a3)>n-3||abs(k-a3)<3)&&flag!=1)
    ans++,flag=1;
                if((abs(i-b1)>n-3||abs(i-b1)<3)&&(abs(j-b2)>n-3||abs(j-b2)<3)&&(abs(k-b3)>n-3||abs(k-b3)<3)&&flag!=1)
    ans++,flag=1;
        }
cout<<ans<<endl;
return 0;

}

三重循环+bool判断;

可以暴力出一个世界;

所以说;

做题时脑子要清醒啊;

要看清题目的条件;

不要像荀彧同学一样那道题目扫一眼就开始敲代码;

往往花的时间又多还容易错;

end...

3>采蘑菇的拖拉机

很好,依旧是一道被某个嘤才改过的题目;

考试四道题里面最难的;

内心绝望;

上题目:

【问题描述】

    春天来了,小范的农场里会长很多蘑菇,而观察奶牛开着拖拉机采蘑菇成了小范喜爱做的一件事情。

    小范的农场被分为了一个平面坐标系,最左下角的坐标为(1,1),最右上角的坐标为(10^5,10^5).

    小范有一个探测蘑菇的雷达,当开启蘑菇雷达后,这个雷达每一秒会发现农场上的一个蘑菇,并且会告知这个蘑菇的坐标。

    小范的奶牛只会沿着一个方向开拖拉机,并且不会拐弯,这里的方向指的是和坐标轴平行的四个方向和与坐标轴夹角45度的对角线(当然是两条对角线)。并且每天小范只允许奶牛开一次拖拉机,也就是说,每次采蘑菇,拖拉机只能沿着一个方向去采集所经过的点的蘑菇。

    小范允许他的奶牛从农场里的任意一个点,任意一个方向出发,并且他的拖拉机的速度奇快,从启动到完成任务话费的时间忽略不计。现在小范想直到,如果要一次性的采集K个蘑菇,最早在什么时间完成任务。

【输入】

为了防止骗分,测试数据为两组,每一组数据格式如下:

第一行两个整数N和K。表示有N个蘑菇出现,小范要采集K个蘑菇。

       接下来N行,第i行为两个整数Xi和Yi,表示第i秒发现的蘑菇的坐标为Xi和Yi。

       在某一个坐标陆续发现多个蘑菇的可能性也是有的。

【输出】

两行,每行一个整数T,表示最早第T秒就可以完成K个蘑菇的采集。如果无法满足要求,那么这行输出-1.

 

【输入输出样例1】

tractor.in

tractor.out

4 3

1 2

3 4

3 2

4 5

5 2

1 1

2 1

1 2

1 3

 

4

2

第四秒开始,可以采集第1,2,4个蘑菇。

 

【数据范围】

   50% 数据保证Xi,Yi在[1..300]之间

  100% 数据保证N在[2..10^6]之间, K在[2..N]之间。Xi和Yi在[1..10^5]之间。

附上子皿六日大佬的注释代码;

跟我的思路是一样的;

只不过人家的有注释;

看的更清楚一点吧:

#include<bits/stdc++.h>
using namespace std;
int a[100001],b[100001],c[200000],d[200000];  //先定义四个数组,分别代表横、竖、对角线四个方向 
int n1,n2,k1,k2,xx,yy;    //因为有两组数据,所以我设了两遍(讲真我就是被这玩意坑死的) 
int main()
{
cin>>n1>>k1;   
int flag1=0;  //表示还不能采蘑菇 
for(int i=1;i<=n1;i++)
{
cin>>xx>>yy; //输入蘑菇坐标 
a[xx]++;                 //横的++ 
b[yy]++;                 //竖的++ 
c[100000+xx-yy]++;       //左上到右下方向的++ 
d[200000-xx-yy]++;       //右上到左下方向的++ 
if(flag1==1) continue;   //表示已经采了,这是为了防止重复输出,但是因为还有蘑菇的坐标没有读入,所以循环还不能停 
if(a[xx]>=k1||b[yy]>=k1) //达到要求就采蘑菇(我这里是因为后来补上所以分成两个 ) 
    {cout<<i<<endl; flag1=1;}
if(c[100000+xx-yy]>=k1||d[200000-xx-yy]>=k1) 
    {cout<<i<<endl; flag1=1;}
}
if(!flag1) cout<<-1<<endl;    //表示没有达到要求 

memset(a,0,sizeof(a));    //因为还有一组,所以要把数组清空 
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    memset(d,0,sizeof(d));

cin>>n2>>k2;
int flag2=0;
for(int i=1;i<=n2;i++)
{
cin>>xx>>yy;
a[xx]++;
b[yy]++;
c[100000+xx-yy]++;
d[200000-xx-yy]++;
if(flag2==1) continue;
if(a[xx]>=k2||b[yy]>=k2) 
    {cout<<i<<endl; flag2=1;}
if(c[100000+xx-yy]>=k2||d[200000-xx-yy]>=k2) 
    {cout<<i<<endl; flag2=1;}
}
if(!flag2) cout<<-1<<endl;
return 0;
}


/*斜行行数和蘑菇坐标的东西可以通过数学得到关系式
具体怎么弄看个人习惯

我是以对角线作为第100000行的*/ 

很坑人的一道题;

重点是要在中间把所有数据清空;

又见到了久违的memset;

懂了就好了;

end...

4>牛语;

还是嘤才改过的题;

令人很无语的无脑基础字符串题;

上题目:

【问题描述】

奶牛们听说猪发明了一种秘密语言,叫做"猪语",因为猪不想让主人小黄知道他们在商量什么.奶牛们也感觉这样很不错,所以她们想发明他们自己的语言,牛语.。想把一个普通的英语单词转换成牛语很简单.如果一个单词的以一个元音字母('a','e','i','o','u)开头,那么只需在 这个单词的结尾加上"cow".例如,"udder"需要变成"uddercow"; 如果一个单词的第一个字母不是元音字母,那么只需把这个单词的第一个字母放到单词结尾,然后再在结尾加上"ow".例如 "farmer"需要变成"armerfow". 所以"the cowsescape at dawn"就会变成"hetow owscow escapecowatcow awndow." 奶牛们自信地以为这样就可以不让小黄知道他们的"越狱"计划. 可惜奶牛们都不是语言学家,他们觉得这样的翻译太无聊了,所以这个任务就交给你了. 你需要将N (1 ≤ N ≤ 100)个英语单词翻译成牛语,单词长度在3到40之间.

 

【输入】

·  第1行: 一个整数N.

·  第2行到第N+1行: 每行一个单词

 

【输出】

·  第1行到第N行,每行一个相应的牛语单词.

 

【输入输出样例1】

latin.in

latin.out

5

udder

farmer

milk

aaa

zzz

uddercow

armerfow

ilkmow

aaacow

zzzow

 

然而;

荀彧同学第一次做的时候开了两个下标!!!

(emmmmm 黑人问号?!)

后来脑子清楚了想明白了;

没事给字符串开个数组干嘛;

直接输入不就好了;

再在每一个单词里面开个数组好了呀;

下表一下判断一下就没问题了;

输出的时候开个for循环;

从第二个字母开始输出就ojbk了;

上代码:

#include<bits/stdc++.h>

using namespace std;
string a;
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
    if(a[0]=='a'||a[0]=='e'||a[0]=='i'||a[0]=='o'||a[0]=='u')
        cout<<a<<"cow"<<endl;
    else
    {
    for(int j=1;j<a.size();j++)
        cout<<a[j];
        cout<<a[0]<<"ow"<<endl;
    }
}    
    return 0;

}

无脑输入;

无脑判断;

无脑输出;

就是这么干脆;

end...

最后再总结一下吧;

虽然说这次考试没有完整的参与;

但是题目都是看了一遍的;

发现自己还是存在很多不足的;

刷题的时候太水;

导致基础不是很扎实;

下一阶段减少刷题量;

提高质量吧;

再把基础的东西好好看一看补一补;

以前做过的题在自己敲一遍;

老母猪可能是真的要停经了;

但是;

以后不仅回生还会养了呀!!!

荀彧同学fighting吧;

全文终。

<think>我们使用Vue3来实现一个水平仪表盘,每个仪表盘代表一个分值,点击仪表盘可以改变其分值。 设计思路: 1. 使用三个水平仪表盘(可以用进度条表示),每个仪表盘有自己的当前值。 2. 每个仪表盘可以点击,点击后增加定分值(比如点击次增加10分),但不超过最大值(比如100分)。 3. 仪表盘可以用一个长条表示,内部用一个填充条表示当前分值,填充的长度与分值成正比。 实现步骤: - 创建Vue应用,包含三个仪表盘组件(或者在一个组件内循环生成)。 - 每个仪表盘的数据包括:当前值(score),最大值(max,比如100),以及一个标识(比如名称)。 - 使用CSS来绘制水平仪表盘:外层一个框(作为背景),内层一个div(作为填充条,宽度根据当前值计算)。 - 为每个仪表盘绑定点击事件,点击时增加分值(比如10分),超过最大值则重置为0或者取模。 代码示例:</think># Vue 水平仪表盘实现 我将为您创建一个交互式水平仪表盘组件,用户可以点击三个仪表盘来改变各自的分值。 ## 设计思路 - 创建三个水平仪表盘组件,每个代表一个可调节的分值 - 使用渐变填充效果展示当前分值 - 添加点击事件增加分值(每次点击增加10分) - 实现分数重置功能(双击重置为0) - 添加平滑过渡动画效果 - 响应式设计适应不同屏幕尺寸 ## 完整实现代码 ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Vue 水平仪表盘</title> <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script> <style> * { margin: 0; padding: 0; box-sizing: border-box; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background: linear-gradient(135deg, #1a2a6c, #b21f1f, #1a2a6c); min-height: 100vh; display: flex; justify-content: center; align-items: center; padding: 20px; } .dashboard-container { width: 100%; max-width: 900px; background: rgba(255, 255, 255, 0.1); backdrop-filter: blur(10px); border-radius: 20px; padding: 30px; box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3); border: 1px solid rgba(255, 255, 255, 0.2); } .header { text-align: center; margin-bottom: 30px; } .header h1 { color: white; font-size: 2.5rem; margin-bottom: 10px; text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3); } .header p { color: rgba(255, 255, 255, 0.8); font-size: 1.1rem; max-width: 600px; margin: 0 auto; } .gauges-container { display: flex; flex-direction: column; gap: 25px; } .gauge { background: rgba(0, 0, 0, 0.3); border-radius: 15px; padding: 20px; transition: transform 0.3s, box-shadow 0.3s; cursor: pointer; position: relative; overflow: hidden; } .gauge:hover { transform: translateY(-5px); box-shadow: 0 8px 20px rgba(0, 0, 0, 0.4); } .gauge-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 15px; } .gauge-title { color: white; font-size: 1.4rem; font-weight: 600; } .gauge-value { background: rgba(255, 255, 255, 0.1); border-radius: 50px; padding: 5px 15px; font-size: 1.2rem; font-weight: bold; color: white; min-width: 80px; text-align: center; } .gauge-bar { height: 30px; background: rgba(255, 255, 255, 0.1); border-radius: 15px; overflow: hidden; position: relative; } .gauge-fill { height: 100%; border-radius: 15px; position: absolute; top: 0; left: 0; transition: width 0.5s cubic-bezier(0.34, 1.56, 0.64, 1); } .gauge-labels { display: flex; justify-content: space-between; margin-top: 8px; color: rgba(255, 255, 255, 0.7); font-size: 0.9rem; } .gauge-markers { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; justify-content: space-between; pointer-events: none; } .marker { width: 2px; height: 100%; background: rgba(255, 255, 255, 0.2); } .instructions { text-align: center; margin-top: 30px; color: rgba(255, 255, 255, 0.7); font-size: 0.95rem; } .gauge-1 .gauge-fill { background: linear-gradient(90deg, #00c9ff, #92fe9d); } .gauge-2 .gauge-fill { background: linear-gradient(90deg, #ff7e5f, #feb47b); } .gauge-3 .gauge-fill { background: linear-gradient(90deg, #8e2de2, #4a00e0); } .reset-btn { display: block; margin: 30px auto 0; padding: 12px 30px; background: rgba(255, 255, 255, 0.15); color: white; border: none; border-radius: 50px; font-size: 1rem; font-weight: 600; cursor: pointer; transition: all 0.3s; backdrop-filter: blur(5px); border: 1px solid rgba(255, 255, 255, 0.2); } .reset-btn:hover { background: rgba(255, 255, 255, 0.25); transform: translateY(-3px); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2); } @media (max-width: 768px) { .header h1 { font-size: 2rem; } .gauge-title { font-size: 1.2rem; } .gauge-value { font-size: 1.1rem; } } @media (max-width: 480px) { .dashboard-container { padding: 20px 15px; } .header h1 { font-size: 1.7rem; } .gauge-header { flex-direction: column; align-items: flex-start; gap: 8px; } } </style> </head> <body> <div id="app"> <div class="dashboard-container"> <div class="header"> <h1>交互式水平仪表盘</h1> <p>点击每个仪表盘增加分值(每次+10),双击仪表盘重置为0分</p> </div> <div class="gauges-container"> <!-- 仪表盘1 --> <div class="gauge gauge-1" @click="increaseScore('gauge1')" @dblclick="resetScore('gauge1')"> <div class="gauge-header"> <div class="gauge-title">技术能力</div> <div class="gauge-value">{{ gauge1 }} / 100</div> </div> <div class="gauge-bar"> <div class="gauge-fill" :style="{ width: gauge1 + '%' }"></div> <div class="gauge-markers"> <div v-for="n in 10" :key="n" class="marker"></div> </div> </div> <div class="gauge-labels"> <span>0</span> <span>50</span> <span>100</span> </div> </div> <!-- 仪表盘2 --> <div class="gauge gauge-2" @click="increaseScore('gauge2')" @dblclick="resetScore('gauge2')"> <div class="gauge-header"> <div class="gauge-title">沟通能力</div> <div class="gauge-value">{{ gauge2 }} / 100</div> </div> <div class="gauge-bar"> <div class="gauge-fill" :style="{ width: gauge2 + '%' }"></div> <div class="gauge-markers"> <div v-for="n in 10" :key="n" class="marker"></div> </div> </div> <div class="gauge-labels"> <span>0</span> <span>50</span> <span>100</span> </div> </div> <!-- 仪表盘3 --> <div class="gauge gauge-3" @click="increaseScore('gauge3')" @dblclick="resetScore('gauge3')"> <div class="gauge-header"> <div class="gauge-title">问题解决</div> <div class="gauge-value">{{ gauge3 }} / 100</div> </div> <div class="gauge-bar"> <div class="gauge-fill" :style="{ width: gauge3 + '%' }"></div> <div class="gauge-markers"> <div v-for="n in 10" :key="n" class="marker"></div> </div> </div> <div class="gauge-labels"> <span>0</span> <span>50</span> <span>100</span> </div> </div> </div> <button class="reset-btn" @click="resetAll">重置所有分数</button> <div class="instructions"> <p>当前总分: {{ totalScore }} / 300</p> </div> </div> </div> <script> const { createApp, ref, computed } = Vue; createApp({ setup() { // 定义三个仪表盘的分数 const gauge1 = ref(40); const gauge2 = ref(60); const gauge3 = ref(20); // 计算总分 const totalScore = computed(() => { return gauge1.value + gauge2.value + gauge3.value; }); // 增加分数的方法 const increaseScore = (gaugeName) => { if (gaugeName === 'gauge1') { gauge1.value = Math.min(gauge1.value + 10, 100); } else if (gaugeName === 'gauge2') { gauge2.value = Math.min(gauge2.value + 10, 100); } else if (gaugeName === 'gauge3') { gauge3.value = Math.min(gauge3.value + 10, 100); } }; // 重置单个仪表盘分数 const resetScore = (gaugeName) => { if (gaugeName === 'gauge1') { gauge1.value = 0; } else if (gaugeName === 'gauge2') { gauge2.value = 0; } else if (gaugeName === 'gauge3') { gauge3.value = 0; } }; // 重置所有分数 const resetAll = () => { gauge1.value = 0; gauge2.value = 0; gauge3.value = 0; }; return { gauge1, gauge2, gauge3, totalScore, increaseScore, resetScore, resetAll }; } }).mount('#app'); </script> </body> </html> ``` ## 代码解释 ### Vue 组件结构 1. **仪表盘容器**:包含三个独立的仪表盘组件 2. **仪表盘组件**:每个仪表盘包含: - 标题和当前分数显示 - 水平进度条(使用渐变背景) - 刻度标记和标签 - 点击和双击事件处理 ### 核心功能 - **分数增加**:通过`increaseScore`方法实现点击增加10分 - **分数重置**:通过`resetScore`方法实现双击单个仪表盘重置为0 - **全部重置**:通过`resetAll`方法重置所有仪表盘分数 - **动态计算**:使用计算属性`totalScore`实时计算总分 ### 视觉设计 - **渐变背景**:每个仪表盘使用不同的渐变效果 - **悬停效果**:仪表盘悬停时有上浮和阴影效果 - **平滑过渡**:进度条变化有平滑动画 - **响应式布局**:适配不同屏幕尺寸 - **半透明玻璃效果**:使用`backdrop-filter`实现毛玻璃效果 ### 交互设计 - 单击仪表盘:增加10分(不超过100) - 双击仪表盘:重置该仪表盘分数为0 - 重置按钮:重置所有仪表盘分数为0 ## 使用说明 1. 单击任意仪表盘可增加10分(最高100分) 2. 双击任意仪表盘可将其分数重置为0 3. 点击"重置所有分数"按钮将所有仪表盘分数重置为0 4. 页面底部显示当前总分 这个实现使用了纯Vue3的Composition API,没有依赖任何外部UI库,可以直接复制到HTML文件中运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值