codeforces div2 525 部分題解
阿新 • • 發佈:2018-12-05
A. Ehab and another construction problem
題目:
按照題目的要求,只需要將輸入的x列印兩遍就可以了。
注意還有x=1的情況,這樣只需要列印-1即可。
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; int main() { int x; scanf("%d",&x); if(x==1) { printf("-1\n"); } else { printf("%d %d\n",x,x); } return 0; }
B. Ehab and subtraction
題目:
此題模擬即可。
可以發現,一個數只需要減去前一個數就是要處理的結果。
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int maxn=1e5+5; int a[maxn]; int n,k; int main() { scanf("%d%d",&n,&k); for (int i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); int j=0,rest=0; for (int i=0;i<k;) { if(j<n&&a[j]-rest) { i++; printf("%d\n",a[j]-rest); rest=a[j++]; } else if(j<n&&a[j]-rest==0) { j++; } else if(j>=n) { i++; printf("0\n"); } } return 0; }
C. Ehab and a 2-operation task
題目:
此題模擬即可,從後往前調到想要的數即可。
程式碼如下:
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <vector> using namespace std; const int maxn=2005; typedef long long ll; int n; ll a[maxn]; ll sum=0; vector<int>ans,ans2; int main() { scanf("%d",&n); for (int i=0;i<n;i++) { scanf("%lld",&a[i]); } ll stand; if(a[n-1]<n+1) { stand=n+1; } else { stand=a[n-1]+1; } for (int i=n-1,j=stand-1;i>=0;i--,j--) { if((a[i]+sum)%stand!=j) { ll t=(a[i]+sum)%stand; ll yu=(t/stand+1)*stand+j-t; ans.push_back(yu); ans2.push_back(i+1); sum+=yu; } } printf("%d\n",ans.size()+1); for (int i=0;i<ans.size();i++) { printf("1 %d %d\n",ans2[i],ans[i]); } printf("2 %d %d\n",n,stand); return 0; }