A
这题考试的时候直接自闭了?!
思路
输出与其他两个不一样的x,y。
#include<iostream>
using namespace std;
int main(){
int x1,x2,x3,y1,y2,y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
if(x1==x2)cout<<x3<<" ";
if(x2==x3)cout<<x1<<" ";
if(x1==x3)cout<<x2<<" ";
if(y1==y2)cout<<y3;
if(y2==y3)cout<<y1;
if(y1==y3)cout<<y2;
}
B
考试的时候这题英语有点难懂,对着样例研究了半天,写出来了。
思路
给一个点A(x,y),与原点O组成的向量OA。
求这个方向的 单位向量 的坐标。
code
#include<bits/stdc++.h>
int main(){
double a,b;scanf("%lf %lf",&a,&b);
printf("%.12f %.12f",a/sqrt(a*a+b*b),b/sqrt(a*a+b*b));
}
C
好久没做贪心了,考试遇到了居然写出来了。
有N件商品的价格,K张价值为X的优惠券。可对任意商品使用任意张优惠券,最高优惠价格为此商品的价格。求买完最少花多少钱。
思路
把商品从大到小排序,能用满的优惠券用满,并把价格减去。
剩余的商品再从大到小排序,还有剩余优惠券肯定是免单大件的,输出剩下不能免单的之和。
code
#include<bits/stdc++.h>
using namespace std;
long long n,k,x,a[200000],ans,t;
int main(){
cin>>n>>k>>x;
for(int i=0;i<n;i++)cin>>a[i];
sort(a,a+n,greater<int>());
while(k>0&&t<n){
if(a[t]<x)break;
int kk=min(k,a[t]/x);
a[t++]-=x*kk;
k-=kk;
}
sort(a,a+n,greater<int>());
for(int i=k;i<n;i++)ans+=a[i];
cout<<ans;
}
D
没做出来。
要找最小的大于等于n的f。
思路
f(a,b)是一个二元三次函数,且保证了N<=1e18;所以a,b<1e6。
这个复杂度是可以暴力的。
找到j=0为止,最小的X肯定是答案。
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll X(ll a,ll b){return a*a*a+a*a*b+a*b*b+b*b*b;}
ll n,x=9e18,j=1e6;
int main(){
cin>>n;
for(ll i=0;i<=1e6;i++)
while(X(i,j)>=n&&j>=0)x=min(x,X(i,j)),j--;
cout<<x;
}