- 赵一静 的博客
八月暑期集训8月22日DAY16题解
- @ 2024-8-22 18:08:57
小K的疑惑(找规律)
思路
打表去找规律,不能凑出的最大数为:。还要注意:对于的数据:,所以要开 !!!
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
freopen("dontforgetfileio.in","r",stdin);
freopen("dontforgetfileio.out","w",stdout);
long long a,b;
cin >>a>>b;
long long ans=((b-1)*(a-1))-1;
cout <<ans;
return 0;
}
Milk Measurement(模拟)
思路没想到的原因
最大问题懒,不愿意多想。在考试时认为自己对于剩下的时间已经不够做出这道题了,所以没有仔细去想,下次应该从这些方面去想:
- 对一道题目,它的题面描述是怎么样的,是什么意思。
- 先想暴力 (有些题目用暴力也能过) ,不能过则跳到下一步
- 这道题目想做出来应该用什么算法;
- 这道题和模版题 (或没有,通用格式) 有什么区别,区别在哪里,应该干什么才能将这个区别消掉或是应该在简单的做过的题上做什么修改才可能过;
- 打草稿
- 有条理
- 目标明确
- 精神集中
- 注意细节与范围或特判 。
思路
输入完后,按照天数排序;再记录每只奶牛在每一天的排名,看相邻两天的最高排名是否发生了变化。所以
判断当前的牛在这一天的排名是否高于挂在墙上的奶牛,并且是当天的第一。如果满足,就更新挂在墙上的奶牛的名字。
还要判断:see[1]!=back[1]||see[2]!=back[2]||see[3]!=back[3],也就是前后挂的奶牛是否不一样。满足,就cnt++。
代码
#include <bits/stdc++.h>
using namespace std;
int n;
const int tt=110;
struct node{
int day;
string name;
int now;
char fh;
}a[tt];
int see[4],back[4];
map<string,int> mp={{"Mildred",7},{"Elsie",7},{"Bessie",7}};
bool cmp(node a,node b){
return a.day<b.day;
}
int main(){
freopen("milk2.in","r",stdin);
freopen("milk2.out","w",stdout);
cin >>n;
for(int i=1;i<=n;i++){
cin >>a[i].day>>a[i].name>>a[i].fh>>a[i].now;
}
int cnt=0;
int max_n=0;
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++){
max_n=0;
string op=a[i].name;
if(a[i].fh=='-'){
mp[op]-=a[i].now;
}else{
mp[op]+=a[i].now;
}
back[1]=see[1];
back[2]=see[2];
back[3]=see[3];
see[1]=0;
see[2]=0;
see[3]=0;
int j=1;
for(auto it:mp){
if(it.second>=max_n){
if(it.second>max_n){
see[1]=0;
see[2]=0;
see[3]=0;
}
max_n=it.second;
see[j]=1;
}
j++;
}
if(see[1]!=back[1]||see[2]!=back[2]||see[3]!=back[3]){
cnt++;
}
}
cout <<cnt;
return 0;
}
Stack in a rut(模拟)
思路
每只牛都不能走回头路,那么要满足n[j].x>e[i].x和n[j].y>e[i].y,也就是坐标满足碰撞的要求,就继续;否则continue;
如果当前的ans数组已经被标记过了,就说明这头牛要停了,就continue;没有被标记,就继续遍历。
最后,判断当前的ans数组,如果等于,输出Infinity,不然输出ans[i]。
代码
#include <bits/stdc++.h>
using namespace std;
const int tt=60;
struct node{
int x,y;
int id;
}e[tt],n[tt];
int ans[tt];
int cnt_n=0,cnt_e=0;
bool cmp_n(node a,node b){
return a.x<b.x;
}
bool cmp_e(node a,node b){
return a.y<b.y;
}
int main(){
freopen("stack.in","r",stdin);
freopen("stack.out","w",stdout);
int s;
cin >>s;
for(int i=1;i<=s;i++){
char op;
int x_1,y_1;
cin >>op>>x_1>>y_1;
if(op=='E'){
cnt_e++;
e[cnt_e].x=x_1;
e[cnt_e].y=y_1;
e[cnt_e].id=i;
}else{
cnt_n++;
n[cnt_n].x=x_1;
n[cnt_n].y=y_1;
n[cnt_n].id=i;
}
}
sort(e+1,e+1+cnt_e,cmp_e);
sort(n+1,n+1+cnt_n,cmp_n);
for(int i=1;i<=cnt_e;i++){
for(int j=1;j<=cnt_n;j++){
if(n[j].x<e[i].x) continue;
if(n[j].y>e[i].y) continue;
int a=n[j].x-e[i].x;
int b=e[i].y-n[j].y;
if(ans[n[j].id]){
continue;
}
if(a<b){
ans[n[j].id]=b;
}
if(a>b){
ans[e[i].id]=a;
break;
}
}
}
for(int i=1;i<=s;i++){
if(ans[i]==0){
cout <<"Infinity"<<endl;
}else{
cout <<ans[i]<<endl;
}
}
return 0;
}
Air Cownditioning II(dfs深搜)
思路没想到的原因
当时觉得最后的题目我肯定做不出来,所以没做了。
思路
因为只有,所以暴力也能过;
暴力枚举所有空调开关的所有情况,用min_n来记录最小花费。可以用搜索所有子集,对于所有子集,搜索,记录空调的情况,判断是否满足奶牛的需求,如果满足,更新min_n;否则,继续遍历。
代码
#include <bits/stdc++.h>
using namespace std;
const int tt=110;
int n,m;
struct node1{
int s,t,c;
}a[tt];
struct node2{
int cnt_a,cnt_b,p,jq;//jq表示金钱
}b[tt];
int cow[tt],wz[tt];
int flag[tt];
int min_n=1e9;
void dfs(int cnt){
if(cnt>m){
int money_now=0;
for(int i=1;i<=m;i++){
if(flag[i]!=0){
money_now+=b[i].jq;
for(int j=b[i].cnt_a;j<=b[i].cnt_b;j++){
cow[j]+=b[i].p;
}
}
}
bool flag_n=true;
for(int i=1;i<=100;i++){
if(cow[i]<wz[i]){
flag_n=false;
break;
}
}
if(flag_n!=false){
min_n=min(min_n,money_now);
}
for(int i=1;i<=100;i++){
cow[i]=0;
}
return;
}
dfs(cnt+1);
flag[cnt]=1;
dfs(cnt+1);
flag[cnt]=0;
}
int main(){
freopen("air.in","r",stdin);
freopen("air.out","w",stdout);
cin >>n>>m;
for(int i=1;i<=n;i++){
cin >>a[i].s>>a[i].t>>a[i].c;
for(int j=a[i].s;j<=a[i].t;j++){
wz[j]=a[i].c;
}
}
for(int i=1;i<=m;i++){
cin >>b[i].cnt_a>>b[i].cnt_b>>b[i].p>>b[i].jq;
}
dfs(1);
cout <<min_n;
return 0;
}