特判最后一位即可
- #include<bits/stdc++.h>
- using namespace std;
- #define int long long
- signed main(){
- int n;cin>>n;int t=n%10;
- if(t==0) cout<<n;
- else if(t>5) {
- cout<<(n+10-t);
- }
- else {
- cout<<(n-t);
- }
- return 0;
- }
暴力就 OK 了
- #include<bits/stdc++.h>
- using namespace std;
- #define int long long
- signed main(){
- int n,a,b;
- cin>>n>>a>>b;
- for(int i=0;;i++){
- if((n-i*a)%b==0&&(n-i*a)>=0){
- cout<<"YES"<<'\n';
- cout<<i<<" "<<(n-i*a)/b;
- return 0;
- }
- if(a*i>n){
- break;
- }
- }
- cout<<"NO";
- return 0;
- }
一道模拟题.
- #include<bits/stdc++.h>
- using namespace std;
- #define int long long
- vector<string> v[66666];
- vector<string> ans[66666];
- map<string,int> vis;
- string st[66666];
- signed main(){
- int n;
- cin>>n;
- int cnt=1;
- for(int i=1;i<=n;i++){
- string str;
- cin>>str;
- if(!vis[str]){
- vis[str]=cnt;
- st[cnt]=str;
- cnt++;
- }
- int m;
- cin>>m;
- for(int j=0;j<m;j++){
- string tle;
- cin>>tle;
- v[vis[str]].push_back(tle);
- }
- }
- for(int i=1;i<cnt;i++){ // vector 实现去重
- sort(v[i].begin(), v[i].end());
- v[i].erase(unique(v[i].begin(), v[i].end()), v[i].end());
- }
- //cout<<'\n';
- for(int i=1;i<cnt;i++){
- map<string,int> mp;
- for(int j=0;j<v[i].size();j++){
- int f=0;
- string temp=v[i][j];
- int len=temp.size();
- for(int k=0;k<v[i].size();k++){
- if(temp==v[i][k]) continue;
- if(v[i][k].size()>temp.size()){ // 后缀
- if(temp==v[i][k].substr(v[i][k].size()-len,len)){
- f=1;
- break;
- }
- }
- }
- if(f){
- mp[temp]=1;
- }
- }
- for(int j=0;j<v[i].size();j++){
- if(!mp[v[i][j]])
- ans[i].push_back(v[i][j]);
- }
- }
- cout<<cnt-1<<'\n';
- for(int i=cnt-1;i>=1;i--){
- cout<<st[i]<<""<<ans[i].size()<<" ";
- for(int j=0;j<ans[i].size();j++){
- if(!j) cout<<ans[i][j];
- else cout<<" "<<ans[i][j];
- }
- cout<<'\n';
- }
- return 0;
- }
尺取 + 贪心
题意 : 给你 n 个闹钟, 分别在 aiai 分钟响. 要求在任意 m 分钟内, 不能多余 k 个闹钟响, 否则就会醒来, 求关闭的最少的闹钟数
- #include<bits/stdc++.h>
- using namespace std;
- #define maxn 666666
- #define int long long
- int arr[maxn];
- signed main(){
- int n,m,k;
- cin>>n>>m>>k;
- for(int i=1;i<=n;i++) cin>>arr[i];
- sort(arr+1,arr+1+n);
- int ans=0;
- deque<int> q;
- for(int i=1;i<=n;i++){
- while(!q.empty()&&arr[i]-q.front()>=m) q.pop_front();
- if(q.size()>=k-1){
- ans++;
- }else{
- q.push_back(arr[i]);
- }
- }
- cout<<ans;
- return 0;
- }
题意: 给你 n 个数, 现在你可以进行一系列操作, 每次操作可以对任意一个数加一或者减一, 使得进行操作后 n 个数中恰好有一半是平方数还有一半是非平方数.
- #include<bits/stdc++.h>
- using namespace std;
- #define int long long
- priority_queue<int,vector<int>, greater<int>> q1;// 平方数
- priority_queue<int,vector<int>, greater<int>> q2;// 非平方数
- signed main(){
- int n;
- cin>>n;
- int sum1=0;// 平方数
- int sum2=0;// 非平方数
- for(int i=1;i<=n;i++){
- int t;cin>>t;
- int cnt=(int)sqrt(t*1.0);
- if(cnt*cnt==t){
- sum1++;
- if(t) q1.push(1);
- else q1.push(2);
- }else{
- sum2++;
- int temp=min((cnt+1)*(cnt+1)-t,t-cnt*cnt);
- q2.push(temp);
- }
- }
- if(sum1==sum2&&sum1==n/2){
- cout<<"0";
- return 0;
- }
- if(sum1>n/2){
- int sum=0;
- int _=abs(sum1-n/2);
- while(_--){
- sum+=q1.top();
- q2.pop();
- }
- cout<<sum;
- return 0;
- }
- int add=0;
- int _=abs(sum2-n/2);
- while(_--){
- add+=q2.top();
- q2.pop();
- }
- cout<<add;
- return 0;
- }
来源: http://www.bubuko.com/infodetail-3382605.html