AtCoder Beginner Contest 181
做题情况
A | B | C | D | E | F |
ac | ac | ac | 赛后ac | ac |
A - Heavy Rotation
略
B - Trapezoid Sum
略
C - Collinearity
题意:给你n个点,让你找出三个点在一条直线上,如果有输出Yes,否则输出No
思路:根据一点点的数学可以知道,如果三个点的的斜率相等的话那么他们就是在一条直线上的

#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<stack> #include<queue> #include<cstring> #include<string> #include<set> //#include<unordered_map> using namespace std; #define m_p make_pair #define fi first #define se second #define pb push_back #define sz(x) (int)(x).size() #define pi acos(-1) #define IO ios::sync_with_stdio(false);cin.tie(0) typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll>pll; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3f; const int eps=1e-9; inline int gcd(int a,int b){return b?gcd(b,a%b):a;} inline int lcm(int a,int b){return a*b/gcd(a,b);} inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } // inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;} // inline void read(int &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();} const int maxn=1e5+50; struct node { int x,y; }e[maxn]; int main() { //IO; int n; cin>>n; for(int i=0;i<n;++i) { cin>>e[i].x>>e[i].y; } int flag=0; for(int i=0;i<n;++i) { for(int j=i+1;j<n;++j) { for(int k=j+1;k<n;++k) { if(e[i].x==e[j].x&&e[i].y==e[j].y&&e[i].x==e[k].x&&e[i].y==e[k].y) { flag=1; break; }else if((e[i].x-e[j].x)*(e[k].y-e[j].y)==(e[i].y-e[j].y)*(e[k].x-e[j].x)) { flag=1; break; } } } } if(flag) cout<<"Yes\n"; else cout<<"No\n"; return 0; }
D - Hachi
题意:给你一个字符串,让你从新组合这地邪恶数组,看是否能被8整除,能的话输出Yes,否则输出No
思路:其实做的时候就已经发现规律的,就如果你是三位数及以上的,如果百位是奇数,那么下面两个数余4,就可以被8整除;如果是偶数,被8整除就可以了
然后我就把它想的很复杂,赛后一想,你去用100到1000之间能被8整除的数一个一个去判断的就可以了。

// #include<cstdio> // #include<cmath> // #include<iostream> // #include<algorithm> // #include<vector> // #include<map> // #include<stack> // #include<queue> // #include<cstring> // #include<string> // #include<set> // //#include<unordered_map> // using namespace std; // #define m_p make_pair // #define fi first // #define se second // #define pb push_back // #define sz(x) (int)(x).size() // #define pi acos(-1) // #define IO ios::sync_with_stdio(false);cin.tie(0) // typedef long long ll; // typedef pair<int,int> pii; // typedef pair<ll,ll>pll; // const int inf=0x3f3f3f3f; // const ll INF=0x3f3f3f3f3f3f3f3f; // const int eps=1e-9; // inline int gcd(int a,int b){return b?gcd(b,a%b):a;} // inline int lcm(int a,int b){return a*b/gcd(a,b);} // inline int read() // { // int x=0,f=1; // char ch=getchar(); // while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();} // while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } // return x*f; // } // // inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;} // // inline void read(int &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();} // const int maxn=1e5+50; // string s; // // void init() // // { // // ll ans=1; // // for(int i=0;i<20;++i) // // { // // ans*=8; // // cout<<ans<<endl; // // } // // } // int vis[maxn]; // bool judge(int x) // { // int tmp[15]={}; // while(x) // { // tmp[x%10]++; // x/=10; // } // bool flag=true; // for(int i=0;i<=9;++i) // { // if(tmp[i]>vis[i]) // { // flag=false; // break; // } // } // return flag; // } // int main() // { // //IO; // //init(); // memset(vis,0,sizeof vis); // cin>>s; // if(s.size()==1) // { // if(s=="8") cout<<"Yes\n"; // else cout<<"No\n"; // }else if(s.size()==2) // { // int num=0; // for(int i=0;i<2;++i) num=num*10+s[i]-'0'; // if(num%8==0) cout<<"Yes\n"; // else // { // int num1=num/10+num%10*10; // if(num1%8==0) cout<<"Yes\n"; // else cout<<"No\n"; // } // }else // { // memset(vis,0,sizeof vis); // for(int i=0;i<s.size();++i) // { // vis[s[i]-'0']++; // } // int flag=0; // for(int i=104;i<=1000;i+=8) // { // if(judge(i)) // { // cout<<"Yes\n"; // flag=1; // break; // } // } // if(!flag) cout<<"No\n"; // } // return 0; // } #include<bits/stdc++.h> using namespace std; string s; int vis[20]; bool work(int x) { int tmp[20]={}; while(x) { tmp[x%10]++; x/=10; } for(int i=0;i<10;++i) { if(vis[i]<tmp[i]) return false; } return true; } int main() { cin>>s; if(s.size()==1) { if(s=="8") cout<<"Yes\n"; else cout<<"No\n"; }else if(s.size()==2) { int num=0; for(int i=0;i<2;++i) { num=num*10+s[i]-'0'; } if(num%8==0) cout<<"Yes\n"; else { int num1=num/10+num%10*10; if(num1%8==0) cout<<"Yes\n"; else cout<<"No\n"; } }else { memset(vis,0,sizeof vis); for(int i=0;i<s.size();++i) { vis[s[i]-'0']++; } int flag=0; for(int i=104;i<1000;i+=8) { if(work(i)) { cout<<"Yes\n"; flag=1; break; } } if(!flag) cout<<"No\n"; } return 0; }
E - Transformable Teacher
题意:给你奇数个数,下面给你m个数,挑选一个放到当中,两两组合的差的和的最小值。
思路:一开始就想到了,这个是可以用前缀和去做的题目,就你如果插入的位数为偶数位n,那么前n-1项的值是可以知道的,后n+1项到最后也是可以知道的,然后就可以了
然后就是很菜,找bug找了有半个多少小时。

#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<stack> #include<queue> #include<cstring> #include<string> #include<set> //#include<unordered_map> using namespace std; #define m_p make_pair #define fi first #define se second #define pb push_back #define sz(x) (int)(x).size() #define pi acos(-1) #define IO ios::sync_with_stdio(false);cin.tie(0) typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll>pll; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3f; const int eps=1e-9; inline int gcd(int a,int b){return b?gcd(b,a%b):a;} inline int lcm(int a,int b){return a*b/gcd(a,b);} inline int read() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } // inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;} // inline void read(int &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();} const int maxn=2e5+50; string s; void init() { ll ans=1; for(int i=0;i<20;++i) { ans*=8; cout<<ans<<endl; } } int vis[maxn]; int n,m,a[maxn],b[maxn],c[maxn]; ll sum1[maxn],sum2[maxn]; int main() { //IO; //init(); cin>>n>>m; for(int i=1;i<=n;++i) cin>>a[i]; for(int i=1;i<=m;++i) cin>>b[i]; sort(a+1,a+n+1); for(int i=2;i<=n;++i) { c[i-1]=a[i]-a[i-1]; if((i-1)%2==0) sum2[i-1]+=c[i-1]+sum2[i-2],sum1[i-1]+=sum1[i-2]; else sum1[i-1]+=c[i-1]+sum1[i-2],sum2[i-1]+=sum2[i-2]; } // for(int i=1;i<n;++i) // { // cout<<sum1[i]<<" "<<sum2[i]<<endl; // } sum1[n]=sum1[n-1],sum2[n]=sum2[n-1]; ll ans=1e18; for(int i=1;i<=m;++i) { int pos=lower_bound(a+1,a+n+1,b[i])-a; //cout<<pos<<endl; if(pos%2) { ll sum=sum1[pos-1]-sum1[0]+sum2[n-1]-sum2[pos]+a[pos]-b[i]; // cout<<pos<<endl; // cout<<sum1[pos-1]-sum1[0]<<" "<<sum1[pos-1]<<" "<<sum1[0]<<endl; // cout<<sum2[n-1]-sum2[pos]<<" "<<sum2[n-1]<<" "<<sum2[pos]<<endl; // cout<<a[pos]-b[i]<<" "<<a[pos]<<" "<<b[i]<<endl; ans=min(sum,ans); // cout<<sum<<endl; }else { ll sum=sum1[pos-2]-sum1[0]+sum2[n-1]-sum2[pos-1]+b[i]-a[pos-1]; // cout<<pos<<endl; // cout<<sum1[pos-2]-sum1[0]<<" "<<sum1[pos-2]<<" "<<sum1[0]<<endl; // cout<<sum2[n-1]-sum2[pos-1]<<" "<<sum2[n-1]<<" "<<sum2[pos-1]<<endl; // cout<<b[i]-a[pos-1]<<" "<<a[pos-1]<<" "<<b[i]<<endl; ans=min(sum,ans); // cout<<sum<<endl; } } cout<<ans<<endl; return 0; }